文章目录
spring中的注解是用来代替xml中繁琐的配置而生的。本文从原始注解和新注解两方面来说明注解的使用。
1 原始注解
applicationContext.xml中指定需要扫描的包或类,spring来识别使用注解配置的类、字段和方法。
<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">
<!--扫描com.test包下所有的类-->
<context:component-scan base-package="com.test"/>
</beans>
1.1 实例化对象的注解
<bean>用来定义将类对象的创建交由spring容器来完成,相应的注解有如下几个(根据实际情况选择一个使用):
注解 | 说明 |
---|---|
@Component | 可在所有类上使用 |
@Controller | 在controller类上使用,同时起到标注的作用 |
@Service | 在service类上使用,同时起到标注的作用 |
@Repository | 在dao类上使用,同时起到标注的作用 |
测试@Repository
@Repository("testDao")
public class TestDaoImp implements TestDao {
public void queryAll() {
System.err.println("queryAll执行了");
}
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
TestDao testDao = (TestDao) applicationContext.getBean("testDao");
testDao.queryAll();
}
}
测试结果:
1.2 依赖注入的注解
使用set进行依赖注入方式时,<bean>下使用<property>进行注入,使用构造方法注入时,<bean>下使用<constructor-arg>进行注入,以下几个注解就能解决繁琐的依赖注入配置问题。
注解 | 说明 |
---|---|
@Autowired | 在字段上使用,根据类型注入 |
@Qualifier | 必须和@Autowired一起使用,根据名称进行注入 |
@Value | 注入普通数据类型值,主要用于获取配置文件中的属性值 |
测试@Autowired+@Qualifier
@Service("testService")
public class TestServiceImp implements TestService {
@Autowired
@Qualifier("testDao")
private TestDao testDao;
public void findAll() {
testDao.queryAll();
System.out.println("findAll执行了");
}
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
TestService testService = (TestService) applicationContext.getBean("testService");
testService.findAll();
}
}
测试结果:
拓展
@Resource,和【@Autowired+@Qualifier】作用相同,但是需要增加依赖。
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
1.3 其他
@Scope 在类上使用标注作用范围,同<bean>中的scope属性,@Scope 注解value值说明:
value | 说明 |
---|---|
singleton | 单例,不加@Scope(“singleton”)也是单例模式创建对象,随着spring容器的存在而存在 |
prototype | 多例,对象使用时创建,对象长时间不使用会被JVM回收 |
request | 同一个request请求创建一个实例对象 |
session | 同一个session会话创建一个实例对象 |
拓展
javax.annotation下的注解:
注解 | 说明 |
---|---|
@PostConstruct | 在方法上使用,标注类的初始化方法 |
@PreDestroy | 在方法上使用,标注类的销毁方法 |
2 新注解
2.1 去掉applicationContext.xml
注解 | 说明 |
---|---|
@Configuration | 指定当前类是一个配置类,替代applicationContext.xml文件 |
@ComponentScan | 组件扫描,替代<context:component-scan> |
@Import | 导入其他配置类,替代<import>。 |
测试
注意:先将applicationContext.xml文件删除或者换个文件名。
//配置类
@Configuration
@ComponentScan("com.test.dao")
public class ApplicationConfig {
}
//测试类,使用AnnotationConfigApplicationContext读取配置
@Repository("testDao")
public class TestDaoImp implements TestDao {
public void queryAll() {
System.err.println("queryAll执行了");
}
@PostConstruct
public void init(){
System.out.println("testDao初始化开始");
}
@PreDestroy
public void destroy(){
System.err.println("testDao被销毁了");
}
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
TestDao testDao = (TestDao) applicationContext.getBean("testDao");
testDao.queryAll();
}
}
2.2 其他
注解 | 说明 |
---|---|
@PropertySource | 用在类上,用于加载.properties 文件中的配置,替代<context:property-placeholder> |
@Bean | 用在方法上,方法的返回值一般为非自定义的Bean的实例对象,返回值存储到 Spring 容器中,替代<bean>。 |
测试
//主配置文件
@Configuration
@ComponentScan("com.test.dao")
@Import({UserConfig.class})
public class ApplicationConfig {
}
//子配置文件
@PropertySource("classpath:user.properties")
public class UserConfig {
@Value("${username}")
private String username;
@Bean(name="authPermission")
public AuthPermission getAuthPermission(){
//AuthPermission为javax.security.auth包下的类,非自定义的类
return new AuthPermission(username);
}
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
AuthPermission authPermission = (AuthPermission)applicationContext.getBean("authPermission");
System.out.println(authPermission.toString());
}
}
user.properties文件中:
username=root
测试结果:
3 使用junit测试
3.1 引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
3.2 测试程序
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})
@ContextConfiguration(classes = {ApplicationConfig.class})
public class TestSpring {
@Autowired
private TestDao testDao;
@Test
public void testDao(){
testDao.queryAll();
}
}
测试结果: