4、常用到的注解列表-自动装配相关

烟雨 5年前 (2021-05-29) 阅读数 435 #Spring
文章标签 Spring

1、@Autowired&@Qualifier&@Primary

Spring利用依赖注入(DI)完成对IOC容器中各个组件的依赖关系赋值。
1)@Autowired:自动注入,是通过AutowiredAnnotationBeanPostProcessor来解析完成自动装配的功能的。
(1)默认优先按照类型去容器中去找对应的组件:applicationContext.getBean(BookDao.class);如果找到了则进行赋值。
(2)如果找到了多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applicationContext.getBean(“bookDao”)。
(3)如果指定了@Qualifier("组件的id"):使用 @Qualifier 指定需要装配的组件的id,而不是使用属性名。
(4)自动装配默认一定要将属性赋值好,没有就会报错,可以使用@Autowired(required = false);来设置为非必须的。
(5)可以利用@Primary:让Spring在进行自动装配的时候,默认使用首选的bean(放在你想要首选注入的类上)。
@Autowired标注在方法/构造器上时,Spring容器在创建当前对象的时候,就会调用当前方法完成赋值,方法使用的参数,自定义类型的值从IOC容器里面进行获取。

2、@Resource&@Inject

Spring还支持使用@Resource(JSR250)和@Inject(JSR330)
- (1)@Resource:可以和@Autowired一样实现自动的装配,默认是按照组件的名称来进行装配(不支持支持@Primary和@Autowired(required = false)功能)。
- (2)@Inject:需要导入javax.inject的包,和@Autowired的功能一样,不支持和@Autowired(required = false)功能。
@Autowired:是Spring定义的。
@Resource 和 @Inject是java的规范。

3、@Profile

多环境搭建。不同环境使用不同的配置文件。
dbconfig.properties
db.user=root
db.password=12345678
db.driverClass=com.mysql.jdbc.Driver
/**
 * Profile:
 *      Spring为我们提供的可以根据当前的环境,动态的激活和切换一系列组件的功能;
 * 		开发环境,测试环境,生产环境
 *		我们以切换数据源为例:
 * 		数据源:开发环境中(用的是A数据库)、测试环境(用的是B数据库)、而生产环境(用的又是C数据库)
 * EmbeddedValueResolverAware
 * 		实现EmbeddedValueResolverAware接口,在setEmbeddedValueResolver(StringValueResolver resolver)方法里面进行获取、
 *      里面使用resolver.resolveStringValue("${db.driverClass}")方法解析,赋值给成员属性private StringValueResolver resolver;
 */
@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigOfProfile implements EmbeddedValueResolverAware {

    @Value("${db.user}")
    private String user;

    private StringValueResolver resolver;

    private String driverClass;

    @Bean("testDataSource")
    public DataSource dataSourceTest(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    @Bean("devDataSource")
    public DataSource dataSourceDev(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    @Bean("prodDataSource")
    public DataSource dataSourceProd(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/prod");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.resolver = resolver;
        driverClass = resolver.resolveStringValue("${db.driverClass}");
    }
}
@Profile根据环境注册bean
1)加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中,默认是default环境,如果指定了default,那么这个bean默认会被注册到容器中。
2)@Profile 写在配置类上,只有是指定的环境,整个配置类里面的所有配置才能开始生效。
3)没有标注环境标识的bean,在任何环境都是加载的。
@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigOfProfile implements EmbeddedValueResolverAware {

    @Value("${db.user}")
    private String user;

    private StringValueResolver resolver;

    private String driverClass;

    @Profile("test")
    @Bean
    public Yellow yellow() {
        return new Yellow();
    }

    @Profile("test")
    @Bean("testDataSource")
    public DataSource dataSourceTest(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Profile("prod")
    @Bean("prodDataSource")
    public DataSource dataSourceProd(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/prod");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.resolver = resolver;
        driverClass = resolver.resolveStringValue("${db.driverClass}");
    }
}

使用命令行动态参数的方式:在虚拟机参数的位置加载-Dspring.profile.active=test

image.png

4、@PathVariable、@RequestParam、@RequestBody

@PathVariable用于获取路径参数。
@RequestParam用于获取查询参数。
@RequestBody用于读取Request请求的body部分并且Content-Type为application/json格式的数据,接收到数据之后会自动将数据绑定到Java对象上去。
注意:一个请求方法只可以有一个@RequestBody,可以有多个@RequestParam和@PathVariable

5、@JsonIgnoreProperties、@JsonIgnore

@JsonIgnoreProperties作用在类上,用于过滤掉特定字段不返回或者不解析。
@JsonIgnoreProperties({"password"})
public class user{
    private String name;
    private String password;
}

@JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties一样。

public class user{
    
    private String name;
    
    @JsonIgnore
    private String password;
}

6、@JsonFormat

用来格式化json数据
@JsonFormat(shape =JsonFormat.Shape.STRING,pattern ="yyyy-MM-dd HH:mm:ss",timezone ="GMT+8")
private Date createTime;

使用@JsonFormat注解需要引入maven依赖如下:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.2</version>
</dependency>


版权声明

非特殊说明,本文由Zender原创或收集发布,欢迎转载。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

作者文章
热门