一、spring
1.spring4快速入门
1、初始化容器的信息方法:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationScan.class);
AnnotationScan类上加上@Configuration、@ComponentScan({“packet”})
ComponentScan里面直接指定包含或者不包含某类 excludeFilters ComponentScan.Filter 是排除@Component类型注解, @Bean不能排除。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("lean1");//这里直接指定包名
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class, User.class, UserDao.class, UserService.class, UserController.class);//直接将类信息扔进容器
2、初始化到容器中
- 在@Configuration的配置类里面 @Bean 通过方法的方式(@Scope(value = “prototype”)指定单例还是多例)
- 实现FactoryBean接口
- 加上@Component类型注解(@Repository(数据访问层) @Service(服务层) @Controller(控制层))等
3、bean 初始化时执行方法和销毁执行方法 3种:
- 实现InitializingBean、DisposableBean接口
- @Bean(initMethod = “init”, destroyMethod = “destroy”) 指方法名称,这样办法不能@Component 这样的注解上使用
- 通过在方法上加上JSR250: @PostConstruct、@PreDestroy注解
- 注入到容器,一般有三个注解 @Autowire @Resource(JSR250注解)
@Inject(JSR330注解)(这个需要加上相应的依赖包)
注意:如果一个类型在容器中有多个使用@Primary优先注入某一个对象,
或者在注入的时候加上@Qualifier(“createUserDao”)指定注入某一个名称的对象。
2.spring扩展分析
1. 获取ApplicationContext3种方法:
- 通过@Autowire 注入
- 实现ApplicationContextAware
- 构造函数(这种只能有一个构造函数, 多个构造函数必要要有默认构造函数 //参数一定要在spring容器中找得到)
public Bank(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}
2. BeanPostProcessor会在每次bean初始化的时候调用一次(可以在这里执行一些处理 比如说代理对象,类似ApplicationContextAware的功能。)
bean生命周期方法执行顺序:
---------------postProcessBeforeInitialization------------class lean2.Cat
-----------afterPropertiesSet------------
-----------init------------
---------------postProcessAfterInitialization------------class lean2.Cat
-----------destroy------------
3.容器初始化回调一次(BeanFactoryPostProcessor接口)
4.对容器做一些操作(BeanDefinitionRegistryPostProcessor接口, 比如注入bean)
通过BeanDefinitionRegistryPostProcessor可以拿到BeanDefinitionRegistry(可以动态注入bean)、 ConfigurableListableBeanFactory