赋值注解
1、通过扫描的方式管理Bean对象
2、在Spring的xml配置文件中配置扫描Bean组件时,<context:component-scan组件扫描标签,扫描指定包中的有以下注解表示的Bean组件@Controller@Service@Respository@Component;
3、改标签中也可以指定扫描包中哪种类型的注解;
4、@Service注解中有个value,可以指定bean的name
如果没有指定的value则使用实现类的名称首字母小写
5、DI注入时:
根据类型匹配注入@Authower
根据名称注入需要@Authower+@Qualifier(beanName)来实现
JDK中@Resource默认使用类型,类型没有则可以使用name名称注入
使用Springboot注解方式管理Bean:
1、在@Configuration配置类中使用@ComponentScan或@ComponentScans注解指定Bean包路径就可以扫描管理Bean组件;默认扫描本包及其子包,或显示指定扫描包;
2、也可以在注解中指定过滤活着包含的Bean组件注解,userDefaultFilter,includeFilter等
@Primary使用:在@Bean方法上,在类上,在<bean标签上
@Value注解给对象属性注入数据
1、直接赋值:@Value(“text”)
2、注入操作系统信息@Value("#{systemProperties[‘os.name’]}")
3、注入表达式结果:调用api获取值然后注入@Value("#{T(java.lang.Math).random()*100}")
4、注入Spring容器中的其他bean属性@Value("#{person.personNam}"),person容器中bean名称;personName是bean中的属性;
5、注入classpath中的resource资源,如txt文件@Value(“classpath:text.txt”)Resource接收
6、注入请求url的结果,@Value(“http://www.baidu.com”) Resource接收
7、注入properties配置文件中的配置项@Value("${jdbc.driver.name}"),这里需要在java配置类中通过@PropertyResource显示引入到Java配置类中,上面的配置才起作用
配置注解
1、@Lazy延迟加载
2、生命周器控制
@PostConstract:指定初始化方法,也可以用在配置类中的方法上
@PreDestory:指定销毁Bean的执行的方法
@DependsOn:Bean初始化和销毁时的顺序,在A类上加上@DependsOn({“b”}),这样spring容器会先实例化b,在实例化a。
3、@Import注解
向Spring容器中注入Bean方式:
方式1:<Bean标签
方式2:<context:component-scan + @Component批量装配
方式3:Java配置类的@Bean
方式4:Java配置类的@ComponentScan+@Component
方式5:BeanFactory+getObject方法
方式6:@Import注解,条件注入bean
静态使用方式:
@Import({aa.class})引入指定的class类就可以
动态根据业务控制需要引入的方式:
动态方式一:实现ImportSelector
实现类接口类中写逻辑什么情况下使用那个类,返回类的全路径类名字符窜,多个类使用String数组返回
@Import(实现了ImportSelector类)
动态方式二:实现ImportBeanDefinitionRegistrar
实现ImportBeanDefinitionRegistrar接口,在实现类中使用BeanDefinitionRegister向Spring容器中注入Bean对象;
把要添加的类使用RootBeanDefinition包装,然后在使用BeanDefinitionRegister注入就可以
4、补充
获取类的全路径类名:类.class.getName()
获取Spring容器中所有类:容器.getBeanDefinitionNames(),返回String[]数组
条件注解
@Condition
通过matcher方法来动态实现是否家在某个类是否需要被加在进Spring容器中;以下所有注解都是实现了condition接口的,然后完成了相关业务和实现。
补充:
获取BeanDefinitionRegister类就可以获取容器中的所有Bean
多环境下的解决方案Profile
profile是condition的一种延伸;
在Java配置类中使用@Bean注入bean对象时使用@Profile(“pro”)指定环境,当spring容器中的Enverment是pro时注入这个Bean其他时注入对应的bean;
Bean对象作用域
就是Spring容器中对象是单例还是多例;
@Scope():prototype多例,singleton单例(默认),request一个请求内一个Bean对象,session一个会话内一个Bean对象
SpringIOC原理浅析
IOC容器初始化:Application. = new ClassPathXmlApplicationContext(“applicationContext.xml”)