1. 将Bean加入到Spring容器里(让Spring 进行管理),有2钟方法
1.使用 一些指定的注解 @Component , @Controller , @Service , @Repository 等
2.创建一个 配置类 ,在类里 创建一个 返回 想要加载的 Bean 的方法
1.给配置类加 注解 @Configuration
2.创建一个 返回 User.class Bean的方法
3.给 该方法 加注解 @Bean
@Configuration
public class MyConfig {
@Bean
public User getUsre(){
return new User();
}
}
2. 获取 Bean
1.通过类名 获取
1. 通过 类.class
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(“com.aa.b”);
context.getBean(User.class)
2. 通过 类的名称 获取 ,如 获取 User.class
1.AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(“com.aa.b”);
context.getBean(“user”)
2. 类的名称要小写
2.通过 配置类中 方法的名称 ,来获取
3.通过类型 获得Bean 时
1. Spring容器里 只有 一个该类型的Bean
可以用 context.getBean(User.class) 来获得
2. Spring容器里 只有 多个该类型的Bean
只能用 context.getBeansOfType(User.class) 来获得,否则 报错
3. 将 ApplicationContext 注入 有3种方法
1.直接用 @Autowired 或 @Resource 或 @Inject 来注解
1.在一个Bean类里, 添加 ApplicationContext 属性
2.用 @Autowired 或 @Resource 或 @Inject 来注解 ApplicationContext 属性
2.实现 ApplicationContextAware
1.让一个 Bean类 实现 ApplicationContextAware 接口
2.在这个Bean类里 添加 ApplicationContext 属性
3.在重写 方法 setApplicationContext 中 加 this.applicationContext=applicationContext
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
3.通过构造方法
1.在一个Bean类里, 添加 ApplicationContext 属性
2.构建 该Bean的带 ApplicationContext 参数 的构造函数,在构造函数 中加 this.pplicationContext=applicationContext
private ApplicationContext applicationContext;
public Bank(ApplicationContext applicationContext){
this.pplicationContext=applicationContext;
}
—–
3.Spring4.3新特性
1.构造函数只能有一个,如果有多个,则必须有一个无参的构造函数.此时,Spring会调用无参的构造函数
2.构造函数的参数,都必须都要Spring容器里
4. 实现 BeanPostProcessor 接口 ,Bean的后置处理器 –对指定的Bean做一些处理,比如返回该对象的代理对象
1.创建一个新的类 ,实现 BeanPostProcessor 接口
2.在该类里 重写 2个方法 postProcessBeforeInitialization() ,postProcessAfterInitialization()
1.postProcessBeforeInitialization
1.方法, 是在 Bean依赖装配(属性设置完)完成之后触发
2.这里可以对指定的Bean做一些处理,比如返回该对象的代理对象
2.postProcessAfterInitialization 方法, 是在bean init方法执行之后触发的
5. 将 ApplicationContext 注入 第2种方法中实现的原理
1.在一个类中 实现一个Spring 特定的接口 BeanPostProcessor ,来对 ApplicationContext 做一些处理
2.执行BeanPostProcessor 接口 中的 postProcessBeforeInitialization()方法。
3. postProcessBeforeInitialization(Object bean,String beanName)方法,中加一个if判断
1.
private Object postProcessBeforeInitialization(Object bean,String beanName){
if(bean instanceof User){
return new ApplicationContext();
}
}
2. ApplicationContext 是User Bean中的属性 。Spring容器刚 注入 User Bean 后,
将 执行 postProcessBeforeInitialization(),在该方法里 返回一个新创建的ApplicationContext 也就是将ApplicationContext注入Spring容器。