1. 注解开发定义bean
1.1 @Component
使用@Component注解替代xml中的<bean>
BookDaoImpl
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
XML
与注解配置的对应关系:
@Component对应<bean>,@Component的value对应<bean>的id属性,@Component修饰的类对应<bean>的class属性
1.2 配置spring扫描的注解包
去掉xml的bean后,spring需要知道哪些package下有bean,所以需要在xml中添加以下配置:
<context:component-scan base-package="com.lan"/>
2. 纯注解开发模式
下面讲解不需要任何xml配置的纯注解开发模式
2.1 创建配置类
SpringConfig
package com.lan.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.lan.service","com.lan.dao"})
public class SpringConfig {
}
2.2 初始化IOC容器
// 根据SpringConfig去初始化IOC容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
2.3 注解开发bean的作用范围和生命周期管理
2.3.1 @Scope
该注解相当于<bean>的scope属性
@Scope("singleton") // 默认值是singleton,可选prototype
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
2.3.2 @PostConstruct和@PreDestroy
分别对应<bean>的init-method和destroy-method属性
2.4 注解方式实现依赖注入
2.4.1 @Autowired
该注解根据类型自动注入bean,可以用于成员变量、构造方法、setter方法
@Autowired // 根据类型自动注入,注入BookDao类型的bean
private BookDao bookDao;
2.4.2 @Qualified
该注解根据bean的id自动注入bean,但不能单独使用,需要和@Autowired一起配合使用
@Autowired // 根据类型自动注入,注入BookDao类型的bean
@Qualified("bookDao") // 配合@Autowired一起使用,根据bean id自动注入bean
private BookDao bookDao;
2.4.3 @PropertySource + @Value 读取properties文件
配置类上使用@PropertySource加载properties文件
package com.lan.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.lan.service","com.lan.dao"})
@PropertySource({"jdbc.properties", "xxx.properties"}) // 指定要加载的properties文件
public class SpringConfig {
}
在bean里使用@Value注入对应的变量
@Value("${spring.datasource.username}") // 注入变量
private String username;
@Value("100") // 注入常量
private int scope;
2.5 注解方式管理第三方bean
2.5.1 @Bean
直接使用@Bean注解创建并管理第三方bean
@Configuration
public class SpringConfig {
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
ds.setUsername("root"); ds.setPassword("root");
return ds;
}
@Bean
public DataSourceWrapper dataSourceWrapper(DataSource datasource) { // 依赖其它bean
return new DataSourceWraper(datasource);
}
}
2.5.2 @Import
通过Import导入配置类,导入的类也会成为bean
SpringConfig
@Configuration
@Import(JdbcConfig.class) // 导入该类,该类可以位于其它package下
public class SpringConfig {
}
JdbcConfig
public class JdbcConfig { // 该类不用加注解
@Value("${datasource.username}")
private String username;
@Value("${datasource.password}")
private String password;
@Value("${datasource.driverClassName}")
private String driverClassName;
@Value("${datasource.jdbcUrl}")
private String jdbcUrl;
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driverClassName);
ds.setUrl(jdbcUrl);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
}
3. Spring整合Junit
maven依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
测试类
package com.itheima.service;
import com.itheima.config.SpringConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//设置类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
//支持自动装配注入bean
@Autowired
private AccountService accountService;
@Test
public void testFindById(){
System.out.println(accountService.findById(1));
}
@Test
public void testFindAll(){
System.out.println(accountService.findAll());
}
}
4. Spring整合Mybatis
新增maven依赖,用于自动生成Mybatis相关的bean
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
SpringConfig
@Configuration
@Import(MybatisConfig.class)
public class SpringConfig {
}
MybatisConfig
package com.lan.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MybatisConfig {
//定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.itheima.domain");
ssfb.setDataSource(dataSource);
return ssfb;
}
//定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
}
使用Mybatis操作接口
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService accountService = ctx.getBean(AccountService.class);
Account ac = accountService.findById(1);