4、常用到的注解列表-自动装配相关
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
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原创或收集发布,欢迎转载。
上一篇:3、常用到的注解列表-属性赋值相关 下一篇:5、常用到的注解列表-异常处理
ZENDER

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