Spring常用注解(1)

1 给容器中注入组件的注解

(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的创建过程。

2、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一个效果。

3、@JsonIgnore

(1)作用
在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
(2)使用方法
一般标记在属性或者方法上,返回的json数据即不包含该属性。
(3)注解失效
如果注解失效,可能是因为你使用的是fastJson,尝试使用对应的注解来忽略字段,注解为:@JSONField(serialize = false),使用方法一样。

4、初始化和销毁方法

(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:在初始化工作之后工作;

5、Java配置类相关注解

@Configuration

声明当前类为配置类;

@Bean

注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式;

@ComponentScan

用于对Component进行扫描;

你可能感兴趣的:(spring,java,数据库)