(1)包扫描+组件标注注解
@Component:泛指各种组件
(@Controller、@Service、@Repository都可以称为@Component)
@Controller:控制层
@Service:业务层
@Repository:数据访问层
(2)@Bean
@Bean导入第三方包里面的注解
(3)@Import
详解可参考:https://mp.weixin.qq.com/s/DcWEo6-7-W1yFpEdkcwIJQ
@Import(要导入到容器中的组件);
@Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
@Scope("prototype")
@Bean("person")
public Person person() {
System.out.println("我是Person");
return new Person("素小暖",25);
}
}
@ImportSelector:返回需要导入的组件的全类名数组;
EnableCaching间接利用了ImportSelector
public class MyImportSelector implements ImportSelector {
//返回值就是导入容器的组件全类名数组
// AnnotationMetadata 当前标注@Import注解的类的所有注解信息
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//打印的是MainConfig2类的全类名
System.out.println(importingClassMetadata.getClassName());
//打印的是MainConfig2类上的注解信息
importingClassMetadata.getAnnotationTypes().forEach(System.out::println);
return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Red"};
}
}
@ImportBeanDefinitionRegistrar:手动注册bean到容器中;
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/*
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类
* 把所有需要添加到容器中的bean,调用BeanDefinitionRegistry.registerBeanDefinition手动注入
*
* */
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
if(definition && definition2){
//指定bean定义信息(bean的类型,bean的scope)
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个bean,指定bean名
registry.registerBeanDefinition("rainBow",rootBeanDefinition);
}
}
}
(4)使用spring提供的FactoryBean(工厂Bean)
最大的作用便是可以让我们自定义Bean的创建过程,参考:https://www.cnblogs.com/wt20/p/10470178.html
默认获取到的是工厂Bean调用getObject创建的对象
要获取工厂Bean本身,需要在id前面加一个&
// 这里注入的是Color实例
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
//创建一个spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一个Color对象,并将Color添加到容器中
public Color getObject() throws Exception {
System.out.println("ColorFactoryBean,getObject()");
return new Color();
}
public Class<?> getObjectType() {
return Color.class;
}
public boolean isSingleton() {
return false;
}
}
FactoryBean存在意义是什么?让我们自定义Bean的创建过程。
@Autowired:由bean提供
@Autowired可以作用在变量、setter方法、构造函数上;
有个属性为required,可以配置为false;
@Inject:由JSR-330提供
@Inject用法和@Autowired一样。
@Resource:由JSR-250提供
@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的,@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用。
@Primary
让spring进行自动装配的时候,默认使用首选的bean,和@Qualifier一个效果。
(1)作用
在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
(2)使用方法
一般标记在属性或者方法上,返回的json数据即不包含该属性。
(3)注解失效
如果注解失效,可能是因为你使用的是fastJson,尝试使用对应的注解来忽略字段,注解为:@JSONField(serialize = false),使用方法一样。
(1)通过@Bean(initMethod=“init”,destoryMethod=“destory”)方法
(2)通过bean实现InitializingBean来定义初始化逻辑,DisposableBean定义销毁逻辑
需要注意的是通过FactoryBean方式注入的bean即使实现了InitializingBean接口,也无法使用初始化逻辑
利用InitializingBean往静态map中加数据:https://blog.csdn.net/FeiChangWuRao/article/details/120240737?
(3)可以使用JSR250:@PostConstruct:初始化方法;@PreDestory:销毁方法。
(4)BeanPostProcessor:bean的后置处理器,在bean初始化前后进行一些处理工作
postProcessBeforeInitialization:在初始化之前工作;
postProcessAfterInitialization:在初始化工作之后工作;
@Configuration
声明当前类为配置类;
@Bean
注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式;
@ComponentScan
用于对Component进行扫描;