获得一个bean的流程
1 声明bean (声明不代表已经创建)
2加载进Spring容器中
3获取
常规的装配bean的两种方式呢?
1 xml配置解析加载
xml声明bean我们已经接触过,这里我们稍微回顾一下步骤
1 classpath下创建springconfig的xml文件
2 通过beanfactory加载
通常我们使用对应资源的applicationCOntext
ApplicationContext context = new ClassPathXmlApplicationContext("beanXmlContext.xml");XmlBeanExample example = context.getBean(XmlBeanExample.class);
bean的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"> <import resource="applicationContext.xml"/> <bean class="com.bean.code.XmlBeanExample" name="beanExample"/></beans>
导入之后就可以获取其他xml中声明的bean
LogAspect logAspect = context.getBean(LogAspect.class);ProductService productService = (ProductService) context.getBean("productService");productService.doSOmeThing();
2注解方式获取
采用注解的方式大致与xml过程一致分为
声明bean 配置bean
bean扫描
加载bean
1 声明bean
注解使用@Component声明一个bean,与xml功能相同可以申明scope bean名称(默认为手写字母小写的类名)
@Component//@Component(value = "student1")@Primary
public class Student { String name; @Value(value = "12") String age;}
2
1的步骤只是声明了一个bean和系统配置,而个个声明都是在class文件中怎么知道bean的存在呢?于是就需要进行扫描找到bean
@ComponentScan//@ComponentScan(basePackages = "com.bean.*")public class StudentConfig {}
而对于ComponentScan默认是扫描自身所在的当前包,当然了也可指定扫描某些个包和需要扫描的某些class
3加载bean到Spring容器中
对于1 2步骤声明和扫描得到bean之后我们需要的就是将这些bean加载到SPring容器中来使用
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(StudentConfig.class);Student student = (Student) context.getBean("student");System.out.println(student);Student student1 = context.getBean(Student.class);System.out.println(student1);StudentService service = context.getBean(StudentService.class);service.getStudent();
上述代码首行就是采用注解的方式来将bean装载到容器中
3自动装载autowried
对于不同自动装载我们还是用学生的粒子,小a和小b两个学生
我们自动装载时怎么区分a和b呢?
Spring为我们提供了策略 :
1 采用优先级
声明bean时有一个@Primary的可选注解,默认遇到相同的bean(类型而非名称)则先采用@Promary的bean
2采用鉴别方式Qualifier
通常我们的bean都是有名字的,那么我们可以通过名称来指定某一个bean进行自动装配
//根据类型来查找到符合条件的 @Autowired//自动装配的时候还可以从符合条件的bean中指定某一个具体的 //如 我们有两个 bean 分别为 a1 a2 那么可以制定哪个 // a1 a2的bean也是有优先级的,默认是注入优先级搞的Primary @Qualifier("student1") //指定student1去干 Student student;
其实这个很好理解:上学时都有课代表,最后大家角逐出了 a b两个,最终老师制定了a,同时说b是备选,当a请假时b来负责……但是莫一天老师看到a在那里学习就说b你去发作业本吧