Spring中Bean的存取方式
一、三大方式存储对象到spring容器中
1、XML方式把Bean存储到spring
1.1、创建Bean类
package com.spring.bean;
public class Student {
private String name;
private int age;
public Student(){
System.out.println("init Student");
}
public void wmi(){
System.out.println("I am student: my name is "+ name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
1.2、将Bean注册到Spring的xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--将类对象,com.spring.bean.Student存进spring容器,名字是student,是一个spring bean-->
<bean id="student" class="com.spring.bean.Student"/>
<bean id="teacher" class="com.spring.bean.Teacher"/>
</beans>
2、五大类注解方式 @Controller等存储Bean到spring
2.1、五大类注解和JavaEE标准分层
2.2、五大类注解方式 往spring中 存储Bean对象
注意点:
- 和二者缺一不可,如果缺少,报错说没有找到这个Bean对象。
- 需要存储在spring中的类本身的位置可以在注册的包中或者它的子包中。
- 这个方法与使用(使用
路径+包名+类名
)的方式可以混合使用。即如果存在某个类需要存储在spring中,但又不适合放在注册的包里的任何位置,就可以将这个类放在注册包之外,但是使用bean注册当前类对象(即使用XML的方式存取对象)。
3、方法注解方式 @Bean存储对象到spring中
3.1、实体类的命名
3.2、存储Bean对象
:
- 1> 方法注解需要配合五大类注解使用。比如UserBeans类下有多个方法注解,在UserBeans上需要加上五大类注解(一般是@Component)。之所以如此,是为了提高效率。
- 2> 方法注解的对象名可以改名。方法注解 对象的名字不同于五大类注解,方法注解是默认方法名,但是可以在方法注解@Bean后加括号,使用name或value属性给Bean对象改名。
注意:
- 给Bean对象改名后,就不能再使用方法名获取到对象,只能使用修改后的名字。
- 如果存在方法名相同的两个@Bean方法在不同类中(都未修改名字),当获取Bean对象时可以在方法上添加@Order(数字),数字小的方法会先注入,但是后注入的方法会发生覆盖。
二、获取Bean对象(依赖注入)
1、获取对象的最基本的方法
2.1、获取Spring容器方式
法一:BeanFactory接口和ClassPathResource继承类
// 获取spring容器
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
import com.spring.bean.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class TeacherMain {
public static void main(String[] args) {
// 懒汉加载:调用时,才加载spring容器中的bean对象,效率不高,但是内存消耗低。
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
Student student = (Student) factory.getBean("student");
student.wmi();
}
}
法二:ApplicationContext接口和ClassPathXmlApplicationContext继承类
// 获取Spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
import com.spring.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class StudentMain {
public static void main(String[] args) {
// 饿汉加载:一次性加载并初始化spring配置文件中的对象,后续操作spring容器中的bean对象时会很快,但是费内存。
// 1通过resources文件夹中的xml文件名,获取spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2获取Bean对象
Student student2 = context.getBean("student", Student.class);
// 3使用spring bean对象
student.wmi();
}
}
2.2、getBean获取指定的Bean对象
2.3、获取Bean对象的名称的命名源码分析
在获取Bean对象时,Bean对象名是什么?
首先,为了突出重点,我们先直接亮出结论:
现在,我们查看spring源码,印证我们的结论: