Spring注解开发
1、Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,因此注解开发是一种趋势,注解可以代替xml配置文件,简化配置操作,提高开发效率
注意:使用注解开发时,需要在applicationContext.xml中配置组件扫描,作用是指定某个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
<!--配置组件扫描-->
<context:component-scan base-package="com.heima"></context:component-scan>
Spring原始注解主要替代< Bean >的配置
代码示例:
项目结构
- UserDaoImpl
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDaoImpl save() running...");
}
}
- @Component(“userDao”):相当于在xml中配置了< bean id=“userDao” class=“com.heima.dao.impl.UserDaoImpl”/>
- 可以用**@Repository(“userDao”)**替换,代表Dao层,增强可读性
2.UserServiceImpl
@Component("userService")
public class UserServiceImpl implements UserService {
// @Autowired
// @Qualifier("userDao")
@Resource(name = "userDao")
private UserDao userDao;
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
@Override
public void save() {
userDao.save();
}
}
- @Component(“userService”):相当于在xml中配置了< bean id=“userService” class=“com.heima.service.impl.UserServiceImpl”>
- 可以用**@Repository(“userService”)**替换,代表Service层,增强可读性
- @Autowired:按照数据类型从Spring容器中查找匹配的bean
- @Autowired+@Qualifier(“userDao”):按照id值从Spring容器中进行匹配的bean
- 相当于在xml中的userService的bean标签下配置了
- @Qualifier(),是按照id值从Spring容器中进行匹配的bean,需要与@Autowired结合使用
- @Resource(name=“userDao”):相当于@Autowired + @Qualifier(“userDao”)
- 由于加了依赖注解,可以省去setUserDao方法
注入普通属性
@Service("userService")
public class UserServiceImpl implements UserService {
@Value("${jdbc.driver}")
private String driver;
由于xml文件已经加载了jdbc.properties,所以里面的键值对jdbc.driver=xxxxx已经加载到了xml中,使用**@Value("")**搭配SpEL表达式即可抽取jdbc配置文件中的数据用做初始化
标注Bean作用范围
@Scope()可以配置对象作用的范围,如singleton单例,prototype多例
@Service("userService")
//@Scope("prototype")
@Scope("singleton")
public class UserServiceImpl implements UserService {
配置Bean初始化、销毁方法
- @PostConstruct,指明该方法在对象创建后调用
- @PreDestroy,指明该方法在对象销毁前调用
@PostConstruct
public void init(){
System.out.println("对象初始化方法");
}
@PreDestroy
public void destroy(){
System.out.println("对象销毁方法");
}
2、Spring新注解
使用之前的原始注解不能全部替代xml配置文件,还需要使用注解替代的配置有:
- 非自定义的Bean的配置:< bean>
- 加载properties文件的配置:<context:property-placeholder location=“classpath:”/>
- 组件扫描的配置:< context:component-scan base-package=""/>
- 引入其他文件:< import resource=“classpath:”/>
可以使用新注解代替xml配置文件的所有内容
核心配置类
核心配置类SpringConfiguration
package com.heima.config;
@Configuration
//标志该类是Spring的核心配置类
@ComponentScan("com.heima")
//扫描包,相当于<context:component-scan base-package="com.heima"/>
@Import({ DataSourceConfigration.class })
//引入其他子配置类,参数为数组,可以引入多个
public class SpringConfiguration {
}
其他子配置类
数据库连接池配置类DataSourceConfigration
package com.heima.config;
@PropertySource("classpath:jdbc.properties")
//引入properties配置文件,相当于 <context:property-placeholder location="classpath:jdbc.properties"/>
public class DataSourceConfigration {
// 由于已引入jdbc.properties配置文件,所以可以用@Value+SpEL表达式注入普通属性,然后赋值给连接池对象
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value(("${jdbc.password}"))
private String password;
@Bean("dataSource")
//Spring会将当前方法的返回值以指定id名称存储到Spring容器当中
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
使用带注解的配置类,摒弃applicationContext.xml配置文件后,获取Spring容器即ApplicationContext,就需要如下方法了
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
3、Spring继承Junit
原有问题
在测试类中,每个测试方法都需要获取Spring容器对象
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
解决方法
- 让SpringJunit负责创建Spring容器,需要传入配置文件名
- 将需要进行测试的Bean直接在测试类中进行注入
实现步骤
- 导入Spring、Junit、Spring集成Junit的jar包依赖
- 使用@Runwith注解替换原来的运行期
- 使用@ContextConfiguration指定配置文件或配置类
- 使用@Autowired注入需要测试的对象
- 创建测试方法进行测试
1、导入Spring、Junit、Spring集成Junit的jar包依赖
pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
//2、使用@Runwith注解替换原来的运行期
@RunWith(SpringJUnit4ClassRunner.class)
//3、使用@ContextConfiguration指定配置文件或配置类
// 配置文件
//@ContextConfiguration("classpth:applicationContext.xml")
//配置类
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
//4、使用@Autowired注入需要测试的对象
@Autowired
private UserService userService;
@Autowired
private DataSource dataSource;
//5、创建测试方法进行测试
@Test
public void test() throws Exception{
userService.save();
System.out.println(dataSource.getConnection());
}
}