spring 容器中注入组件方式 @Bean 默认是单例加载模式,getBean 获取的话,获取的是同一个对象 @Scope 模式 single 作用域: prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。 * 每次获取的时候才会调用方法创建对象; * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。 * 以后每次获取就是直接从容器(map.get())中拿, * request:同一次请求创建一个实例 * session:同一个session创建一个实例 @Lazy 懒加载 默认是true 需要用的时候在创建,实例也只存在一个 工厂方式注入组件 @Import 导入组件 {Class 数组} 可以直接导入 Color.class,也可以通过selector or registrar 进行注册 实现ImportSelector返回需要注册的 bean类 实现ImportBeanDefinitionRegistrar 注册自定义的实体bean 执行顺序:ImportSelector --> ImportBeanDefinitionRegistrar @Conditional 有条件的注入组件,可以作用在方法上,也可以作用在类上 需要 定义类实现 Condition ,返回true or false #____________________________________________________________ | FactoryBean 工厂,定义类来实现bean工厂,用工厂的方式生产bean @ComponentScan @ComponentScan(value = {"com.ityang.service"}) 默认扫描的注解 @Service @Controller @Configuration @Repository @Component @ComponentScan(value = {"com.ityang.service"}, 排除 exclude excludeFilters = { @ComponentScan.Filter( type = FilterType.CUSTOM, 自定义 value = MyTypeFilter.class)}) 自定义 实现TypeFilter 返回false 为加载,true不加载 srping 容器默认是单实例的,对于一个已经加载到容器中的组件,在通过@Bean的方式注入,是不行的 会出现org.springframework.beans.factory.NoUniqueBeanDefinitionException,针对这个类,spring已经加载过了 在加载到容器中是不被允许的,组件加载到容器的方式其实只能使用其中的某一种, 解决方式可以使用 @Primary 让容器知道要加载哪一个 @Autowired 依赖注入, 默认使用 context.getBean(Color.class) 方式去容器查找,如果存在两个或者多个Color的实例, 在使用 属性名去找 context.getBean("color") 找到就返回,如果还没有找到,就会 会报错 NoUniqueBeanDefinitionException,因为容器中有多个Color的实例,却不能 给这个依赖注入上 如果使用默认的方式找不到,也会报错,因为依赖注入,必须要依赖上去的,可以设置 @Autowired(required = false) 找不到也不要报错 @Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名 @Primary : spring装配的时候优先装配的bean ,获取的时候优先使用这个注解的bean, Qualifier的优先级要大于Primary @Resource 可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的; 不支持 @Primary 也支持,@Qualifier 没有支持@Autowired(reqiured=false); @Inject 需要导入javax.inject的包,和Autowired的功能一样。 但支持@Primary @Qualifier 没有required=false的功能; context.getBean(Class) 与 context.getBean(name) 的相同点 都是要求id 或者类型在容器中唯一 否则会报错NoUniqueBeanDefinitionException
spring 容器常用注解,解释
最新推荐文章于 2024-08-06 16:34:07 发布