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>
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