1、常用注解
- @Component:通用注解
- @Repository:一般用于注解持久化层的类
- @Service:一般用于注解Service类
- @Controller:一般用于注解控制器类。
- @Named:与@Component用法相同。
- @Autowired:注入对象,用于修饰成员,set方法和构造方法。
- @Resource:与@Autowired用法相同
- @Inject:与@Autowired用法相同
- @Required:修饰set方法,作用与@Autowired相同,注入对象
- @Configuration:声明Bean的配置,与@Bean一起使用。
- @Bean:声明Bean,与xml中使用<bean></bean>效果相同,与@Configuration一起使用
- @ImportResource:加载包含配置文件信息的xml文件,与@Value一起使用。
- @Value:获取@ImportResource处理的配置文件中的配置项,与@ImportResource一起使用。
- @PostConstruct:表示被修饰的方法为bean初始化回调方法。
- @PreDestroy:表示被修饰的方法为bean销毁回调方法。
- @Scope:标识作用域和代理方式,可以配置@Componment或者@Bean使用
2、XML文件格式及Bean扫描
使用 <context:component-scan base-package=""/>
或者<context:annotation-config>
指定Bean的自动检测范围。
<context:component-scan base-package=""/>
能够处理类的注解,功能更强大,并且能够完全覆盖后者。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定Bean扫描的范围-->
<context:component-scan base-package="service"/>
</beans>
在xml文件中可以通过include和exclude进行自定义扫描,<context:component-scan base-package=""/>
节点允许有两个子节点<context:include-filter type="" expression=""/>
和<context:exclude-filter type="" expression=""/>
使用<context:include-filter type="" expression=""/>
时,一定要在<context:component-scan base-package=""/>
中设置属性use-default-filters=false
。
<context:component-scan base-package="service" use-default-filters="false">
<context:include-filter type="" expression=""/>
<context:exclude-filter type="" expression=""/>
</context:component-scan>
关于type的值,可以参考Spring官网的描述:
3、Bean对象的命名
使用注解可以显示指定Bean对象的名称,如果没有指定,则使用BeanNameGenerator
自动生成的名称。
@Component("hello")
public class HelloServiceImpl implements HelloService
{
public void serviceSave(String arg){
System.out.println("输入数据是:" + arg);
}
}
可以自定义命名策略,条件是实现BeanNameGenerator
接口(需要包含无参构造函数),并在XML中进行指定。
package service;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
public class MyNameGenerator implements BeanNameGenerator {
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
return definition.getBeanClassName().toUpperCase();
}
public MyNameGenerator() {
}
}
<context:component-scan base-package="service" name-generator="service.MyNameGenerator"/>
4、Bean的作用域
使用注解:@Scope("")
@Component
@Scope("prototype")
public class HelloServiceImpl implements HelloService
{
}
可以自定义scope策略,条件是实现ScopeMetadataResolver
接口(需要包含无参构造函数),并在XML中指定。
public class MyScopeMetadataResolver implements ScopeMetadataResolver {
public ScopeMetadata resolveScopeMetadata(BeanDefinition beanDefinition) {
ScopeMetadata metadata = new ScopeMetadata();
...
return metadata;
}
public MyScopeMetadataResolver() {
}
}
<context:component-scan base-package="service" scope-resolver="service.MyScopeMetadataResolver"/>
5、@Required和@Autowired
@Required注解用来修饰set方法,表示受影响的Bean必须在配置时候被设置。
@Autowired注解使用范围更大,可以修饰成员变量,或者set方法或者构造方法,实现的效果是相同的。如果找不到对应的Bean,会注入失败抛出异常,可以通过设置@Autowired中required=false来避免。
@Autowired(required = false)
@Autowired可以修饰集合或者数组。当修饰集合或者数组的时候,Spring会将ApplicationContext
中所有对应类型的Bean注入进去。当类中依赖抽象的集合的时候,这种机制可以将所有实现该接口的对象注入到集合中。对于List集合,可以通过在对应Bean上使用@Order注解保证集合中的顺序。
@Repository
@Order(1)
public class DAOImpl implements DAO {
public void DAOSave(String arg) {
}
}
@Repository
@Order(2)
public class DAOImplBak implements DAO {
public void DAOSave(String arg) {
}
}
@Component
public class HelloServiceImpl implements HelloService
{
@Autowired
private List<DAO> daos;
public void serviceSave(){
for (DAO dao : daos)
{
System.out.println(dao.getClass().getName());
}
}
}
learn.DAO.DAOImpl
learn.DAO.DAOImplBak
Process finished with exit code 0
@Autowired修饰抽象成员的时候,配合使用@Qualifier注解,指定被注入的对象的名称。
@Autowired
@Qualifier("DAOImplBak")
private DAO dao;
6、@Bean
@Bean注解配合@Configuration,能够实现在java代码中,做到与xml配置<bean>一样的效果。
@Configuration
public class ServiceConfig {
@Bean(name = "ttService", initMethod = "init", destroyMethod = "dest")
public TestService testService()
{
return new TestService();
}
}
public class TestService {
public void init()
{
}
public void dest()
{
}
}
上述代码等同的效果,就是在xml文件中做出如下配置
<bean id="ttService" class="learn.service.TestService" init-method="init" destroy-method="dest"></bean>
@Bean注解可以用于自定义实现的processer。
使用@Bean注解定义Bean的时候,可以配合使用@Scope,指定Bean的作用域和代理方式。
7、@ImportResource和@Value注解进行配置文件的加载和使用
@ImportResource和@Value注解主要用于配置文件的加载和使用。通过@ImportResource注解指定配置文件的路径,使用@Value注解使用配置文件中的具体配置。
加载配置文件有2中方式,一种是直接通过xml文件进行加载和使用;另外一种是通过注解方式。
通过xml加载和使用:
<context:property-placeholder location="classpath:/db.properties"/>
<bean name="databaseConfig" class="learn.service.DatabaseConfig">
<property name="ipAddress" value="${db.ip}"/>
<property name="userName" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="port" value="${db.port}"/>
</bean>
通过注解方式加载和使用:
configuration.xml文件中添加placeholder配置:
<context:property-placeholder location="classpath:/db.properties"/>
在代码中,通过@ImportResource注解指定placeholder所在的xml文件
@Configuration
@ImportResource("classpath:configuration.xml")
public class Config {
@Value("${db.username}")
private String userName;
@Value("${db.password}")
private String password;
@Value("${db.ip}")
private String ipAddress;
@Value("${db.port}")
private int port;
@Bean
public DatabaseConfig databaseConfig()
{
return new DatabaseConfig(userName, ipAddress, port, password);
}
}
8、@Resource注解使用方式与@Autowired使用方式相同
9、@PostConstruct和@PreDestroy
@PostConstruct和@PreDestroy修饰函数,表示bean的初始化回调方法和销毁回调方法。与xml配置方式中指定init-method
和destroy-method
的效果是相同的。
@PostConstruct
public void init()
{}
@PreDestroy
public void destroy()
{}
10、@Inject注解
@Inject与@Autowired是等效的,用于类,属性,set方法,构造器。
10、@Named注解
@Named与@Component是等效的,用于修饰类。