目录
【使用@PropertySource注解加载properties文件】
【Spring】
【注解开发定义bean】
【使用】
1、使用@Component定义bean
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save...");
}
}
2、核心配置文件中通过组件扫描加载bean(扫描该路径下的所有文件夹)
<context:component-scan base-package="com.itheima"/>
【注意】
Spring提供@Component注解的三个衍生注解(区分)
- @Controller:用于表现层bean定义
- @Service:用于业务层bean定义
- @Repository:用于数据层bean定义
【纯注解开发】
【使用】
1、Java类代替Spring核心配置文件
- @Configuration注解用于设定当前类为配置类
例:
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
2、读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
public static void main(String[] args) {
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
【注意】
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({com.service","com.dao"})
【bean的作用范围】
1、定义单例或非单例
- 单例:singleton
- 非单例:prototype
例:
@Component
@Scope("singleton")
public class BookDaoImpl implements BookDao {
}
2、定义生命周期使用
- 初始化:@PostConstruct
- 销毁:@PreDestroy
例:
@Component
@Scope("singleton")
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("book dao constructor ...");
}
@PostConstruct
public void init(){
System.out.println("book init ...");
}
@PreDestroy
public void destroy(){
System.out.println("book destory ...");
}
}
【注解开发的自动装配】
【使用@Autowired注解开启自动装配模式(按类型)】
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
【注意】
- 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
- 自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
【使用@Qualifier注解开启指定名称装配bean】
@Service
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
【注意】
@Qualifier注解无法单独使用,必须配合@Autowired注解使用
【使用@Value实现简单类型注入】
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
@Value("100")
private String connectionNum;
}
【使用@PropertySource注解加载properties文件】
@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
}
【注意】
路径仅支持单一文件配置,多文件请使用数组格式配置(使用{}),不允许使用通配符*
【第三方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】
1、独立配置类
public class JdbcConfig {
@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;
}
}
2、将独立配置类加入核心配置
【方式一】:导入式
public class JdbcConfig {
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
//相关配置
return ds;
}
}
使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
@Configuration
@Import(JdbcConfig.class)
public class SpringConfig {
}
【方式二】:扫描式
@Configuration
public class JdbcConfig {
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource(); //相关配置
return ds;
}
}
使用@ComponentScan注解扫描配置类所在的包,加载对应的配置类信息
@Configuration
@ComponentScan({"com.itheima.config","com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}
【第三方bean依赖注入】
【简单类型依赖注入】
public class JdbcConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String userName;
@Value("root")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(userName);
return ds;
}
}
【引用类型依赖注入】
@Bean
public DataSource dataSource(BookService bookService){
System.out.println(bookService);
DruidDataSource ds = new DruidDataSource(); //属性设置
return ds;
}
【注意】
引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
【XML配置与注解配置比较】
功能 | XML配置 | 注解配置 |
定义bean | bean标签
| @Component
@ComponentScan |
设置依赖注入 | setter注入(set方法)
构造器注入
自动装配 | @Autowired
@Value |
设置第三方bean | bean标签 静态工厂、实例工厂、FactoryBean | @Bean |
作用范围 | scope属性 | @Scope |
生命周期 | 标准接口
| @PostConstructor @PreDestroy |
【Spring整合MyBatis】
【步骤】
1、导入相关坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
2、将原本的配置文件优化为spring的bean
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setTypeAliasesPackage("com.itheima.domain");
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
}
优化比较:
【Spring整合JUnit】
【步骤】
1、添加jar包
<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>
2、使用Spring整合Junit专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
@Autowired
private AccountService accountService;
@Test
public void testFindById(){
System.out.println(accountService.findAll());
}
}