19-注解开发定义bean
Spring的IOC/DI对应的配置开发前面的内容已经讲解完成,但是使用起来相对来说还是比较复杂的,复杂的地方在配置文件。
Spring到底是如何简化代码开发的呢?
要想真正简化开发,就需要用到Spring的注解开发,Spring对注解支持的版本历程:
- 2.0版开始支持注解
- 2.5版注解功能趋于完善
- 3.0版支持纯注解开发
关于注解开发,有两块内容: 注解开发定义bean和纯注解开发。
注解开发定义bean用的是2.5版提供的注解,纯注解开发用的是3.0版提供的注解。
环境准备
- 创建一个Maven项目
- pom.xml添加Spring的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
- resources下添加applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bookDao" class="com.yolo.dao.impl.BookDaoImpl"/>
</beans>
- 添加BookDao、BookDaoImpl、BookService、BookServiceImpl类
public interface BookDao {
public void save();
}
- 创建运行类App
public class APP {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
注解开发定义bean
- 步骤一:删除原有的XML配置
将配置文件中的bean标签删除掉
<!-- <bean id="bookDao" class="com.yolo.dao.impl.BookDaoImpl"/>-->
- 步骤二:在Dao上添加注解
在BookDaoImpl类上添加@Component注解
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
注意:@Component注解不可以添加在接口上,因为接口是无法创建对象的。
- 步骤三:配置Spring的注解包扫描
为了让Spring框架能够扫描到写在类上的注解,需要在配置文件上进行包扫描
<!--开启注解扫描-->
<context:component-scan base-package="com.yolo"/>
说明:component-scan
- component:组件,Spring将管理的bean视作自己的一个组件
- scan:扫描
- base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解。
- 包路径越多如:com.yolo.dao.impl,扫描的范围越小速度越快 包路径越少如:com.blog,扫描的范围越大速度越慢
一般扫描到项目的组织名称即Maven的groupId下如:com.yolo即可。
- 步骤四:运行程序
结果如下
- 步骤五:Service上添加注解
在BookServiceImpl类上也添加@Component交给Spring框架管理
@Component
public class BookServiceImpl implements BookService {
public void save() {
System.out.println("book service save ...");
}
}
- 步骤六:运行程序
在App类中,从IOC容器中获取BookServiceImpl对应的bean对象
public class APP {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//按照名称获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//按照类型获取bean
BookService bookService = ctx.getBean(BookService.class);
bookDao.save();
bookService.save();
}
}
结果如下
说明:
- BookServiceImpl类没有起名称,所以在App中是按照类型来获取bean对象
- @Component注解如果不起名称,会有一个默认值就是当前类名首字母小写,所以也可以按照名称获取,如下:
BookService bookService = (BookService) context.getBean("bookServiceImpl");
对于@Component注解,还衍生出了其他三个注解@Controller、@Service、@Repository
通过查看源码会发现:这三个注解和@Component注解的作用是一样的,为什么要衍生出这三个呢?
- 这是方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类。
20-纯注解开发模式
上面已经可以使用注解来配置bean,但是依然有用到配置文件,在配置文件中对包进行了扫描,Spring在3.0版已经支持纯注解开发,使用Java类替代配置文件,开启了Spring快速开发赛道,那么具体如何实现?
思路分析:
将配置文件applicationContext.xml删掉,用SpringConfig类来替换
实现步骤
- 步骤一:创建配置类
创建一个配置类SpringConfig
public class SpringConfig {
}
- 步骤二:标识该类为配置类
在配置类上面加一个@Configuration注解,将其标识为一个配置类,用于替换掉applicationContext.XML
@Configuration
public class SpringConfig {
}
步骤三:用注解替换包扫描配置
在配置类上添加包扫描注解@ComponentScan替换<context:component-scan base-package=""/>
@Configuration
@ComponentScan("com.yolo")
public class SpringConfig {
}
- 步骤四:创建运行类并执行
创建一个新的运行类AppForAnnotation
public class AppForAnnotation {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//按照名称获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//按照类型获取bean
BookService bookService = ctx.getBean(BookService.class);
bookDao.save();
bookService.save();
}
}
注意AnnotationConfigApplicationContext(SpringConfig.class)中SpringConfig.class不用加""
运行AppForAnnotation,可以看到两个对象依然被获取成功
至此,纯注解开发的方式就已经完成了,主要内容包括:
- Java类替换Spring核心配置文件
@Configuration
注解用于设定当前类为配置类@ComponentScan
注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({com.yolo.service","com.yolo.dao"})
- 读取Spring核心配置文件初始化容器对象切换为,读取Java配置类初始化容器对象
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
@Configuration
@ComponentScan
小结
这部分要重点掌握的是使用注解完成Spring的bean管理,需要掌握的内容为:
- 记住
@Component
、@Controller
、@Service
、@Repository
这四个注解 - applicationContext.xml中
<context:component-san/>
的作用是指定扫描包路径,注解为@ComponentScan
@Configuration
标识该类为配置类,使用类替换applicationContext.xml文件- ClassPathXmlApplicationContext是加载XML配置文件
- AnnotationConfigApplicationContext是加载配置类