AnnotationConfigApplicationContext类
可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷。
ApplicationContext app = new AnnotationConfigApplicationContext(ObjectConfig.class);
String[] s = app.getBeanNamesForType(Person.class);//获取该类型的bean
String[] beans = app.getBeanDefinitionNames();//获取所有bean的名字
for (String beanName:beans) {
System.out.println(beanName);
}
User bean1 = app.getBean(User.class);//根据类的class文件获取bean
User bean2 = app.getBean(User.class);//根据类的class文件获取bean
System.out.println(bean1==bean2);//判断Spring是单例还是多例
组件添加
@ComponentScan扫描规则
1,指定扫描范围:
_
@ComponentScan(value="com.enjoy.cap2")
_2,扫描过滤器
在Cap2MainConfig申明
@ComponentScan(value="com.enjoy.cap2",includeFilters={
@Filter(type=FilterType.CUSTOM,classes={JamesTypeFilters.class})
},useDefaultFilters=false)
3,自定义过滤规则
@ComponentScan(value="com.enjoy.cap2", includeFilters={ //表示
* @Filter(type=FilterType.ANNOTATION, classes={Controller.class})
* }, useDefaultFilters=false)//当useDefaultFilters=true时,会默认扫描含有@Component注解的类
@ComponentScan value:指定要扫描的包
excludeFilters
= Filter[] 指定扫描的时候按照什么规则排除那些组件
includeFilters
= Filter[] 指定扫描的时候只需要包含哪些组件
useDefaultFilters
= false 默认是true,扫描所有组件,要改成false
----扫描规则如下
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口
@Bean
@Configuration
@Component
@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
@Service
@Service 通常作用在业务层,但是目前该功能与 @Component 相同
@Controller
@Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
@Repository
作用于dao层的注解
为什么 @Repository 只能标注在 DAO 类上呢?
这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。
@Conditional
@Conditional条件注册bean
例如:如果我想根据当前操作系统来注入Person实例,windows就注入Person,Linux就注入User
1,什么条件注册bean? 2,如何根据指定条件选择性地注册bean实例
@Primary
@Lazy
什么是懒加载:就是在获取该类的时候才会实例化
_
懒加载如何获取容器中的bean
@Lazy(value = false) 或者 @Lazy(false) 那么对象会在初始化的时候被创建,默认为false
@Lazy注解注解的作用主要是减少springIOC容器启动的加载时间
当在Cap4MainConfig加入@Lazy时, 只有获取anno.getBean时才会加载到IOC容器中
@Scope
默认的bean是单实例的,加了@Scope(“prototype”)表示是多实例的
User bean1 = app.getBean(User.class);//根据类的class文件获取bean
User bean2 = app.getBean(User.class);//根据类的class文件获取bean
System.out.println(bean1==bean2);//判断Spring是单例还是多例
prototype:多实例: IOC容器启动的时候,IOC容器启动并不会去调用方法创建对象, 而是每次获取的时候才会调用方法创建对象
singleton:单实例(默认):IOC容器启动的时候会调用方法创建对象并放到IOC容器中,以后每次获取的就是直接从容器中拿(大Map.get)的同一个bean
request: 主要针对web应用, 递交一次请求创建一个实例
session:同一个session创建一个实例