1、什么是注解驱动
注解启动时使用注解的形式替代xml配置,将繁杂的spring配置文件从工程中彻底消除掉,简化书写
2、注解驱动的弊端
-
为了达成注解驱动的目的,可能会将原先很简单的书写,变的更加复杂
-
XML中配置第三方开发的资源是很方便的,但使用注解驱动无法在第三方开发的资源中进行编辑,因此会增大开发工作量
3、启动注解功能
- 启动注解扫描,加载类中配置的注解项
<context:component-scan base-package="packageName"/>
-
说明:
-
在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描
-
扫描过程是以文件夹递归迭代的形式进行的
-
扫描过程仅读取合法的java文件
-
扫描时仅读取spring可识别的注解
-
扫描结束后会将可识别的有效注解转化为spring对应的资源加入IoC容器
-
-
注意:
-
无论是注解格式还是XML配置格式,最终都是将资源加载到IoC容器中,差别仅仅是数据读取方式不同
-
从加载效率上来说注解优于XML配置文件
-
4、bean的定义
-
名称:@Component @Controller @Service @Repository
-
类型:类注解
-
位置:类定义上方
-
作用:设置该类为spring管理的bean
- 范例:
@Component
public class ClassName{}
-
说明:
-
@Controller、@Service 、@Repository是@Component的衍生注解,功能同@Component
-
-
相关属性
-
value(默认):定义bean的访问id
-
示例:
- 项目结构
- 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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--启动注解驱动,指定对应的扫描路径,也就是资源所在的包--> <context:component-scan base-package="com.itheima" /> <!--原本这些是需要进行下面配置的,使用注解后就不需要进行配置了--> <!-- <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" /> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>--> </beans>
- UserServiceImpl实现类中添加注解(另外两个配置方法与其相似,故略)
package com.itheima.service.impl; import com.itheima.service.UserService; import org.springframework.stereotype.Component; @Component("userService") public class UserServiceImpl implements UserService { public void save() { System.out.println("user service running...."); } public void init() { System.out.println("user service init...."); } public void destroy() { System.out.println("user service destroy...."); } }
5、bean的作用域
-
名称:@Scope
-
类型:类注解
-
位置:类定义上方
-
作用:设置该类作为bean对应的scope属性
- 范例:
@Scope
public class ClassName{}
-
相关属性
-
value(默认):定义bean的作用域,默认为singleton
-
6、bean的生命周期
-
名称:@PostConstruct、@PreDestroy
-
类型:方法注解
-
位置:方法定义上方
-
作用:设置该类作为bean对应的生命周期方法
- 范例:
@PostConstruct
public void init() { System.out.println("init..."); }
示例:UserServiceImpl中添加注解
package com.itheima.service.impl;
import com.itheima.service.UserService;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component("userService")
@Scope("singleton")
public class UserServiceImpl implements UserService {
public void save() {
System.out.println("user service running....");
}
@PostConstruct
public void init() {
System.out.println("user service init....");
}
@PreDestroy
public void destroy() {
System.out.println("user service destroy....");
}
}
7、加载第三方资源
-
名称:@Bean
-
类型:方法注解
-
位置:方法定义上方
-
作用:设置该方法的返回值作为spring管理的bean
- 范例:
@Bean("dataSource")
public DruidDataSource createDataSource() { return ……; } -
说明:
-
因为第三方bean无法在其源码上进行修改,使用@Bean解决第三方bean的引入问题
-
该注解用于替代XML配置中的静态工厂与实例工厂创建bean,不区分方法是否为静态或非静态
-
@Bean所在的类必须被spring扫描加载,否则该注解无法生效
-
-
相关属性
-
value(默认):定义bean的访问id
-