三.IOC基于注解开发
1.导包
核心包:spring-beans-4.2.4.RELEASE.jar,spring-context-4.2.4.RELEASE.jar,spring-core-4.2.4.RELEASE.jar,spring-expression-4.2.4.RELEASE.jar
日志包:com.springsource.org.apache.commons.logging-1.1.1.jar 日志规范
com.springsource.org.apache.log4j-1.2.15.jar 日志实现
aop包:spring-aop-4.2.4.RELEASE.jar
同时日志还需要log4j.properties 配置文件
2.配置
需要在applicationContext.xml文件中开启注解扫描,让spring去扫描指定位置下的类。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 告知spring在创建容器时要扫描的包。当配置了此标签之后,spring创建容器就会去指定的包及其子包下找对应的注解
标签是在一个context的名称空间里,所以必须在约束中导入context名称空间
-->
<context:component-scan base-package="com.itheima"></context:component-scan>
</beans>
3.注解分类
1.用于创建bean对象
@Component
作用:就相当于配置了一个bean标签,交给spring来管理
它能出现的位置:类上面
属性:value。指定bean的id,当不写时,它有默认值,默认值是:当前类的短名首字母小写(例如类名ICustomerServiceImpl,那么bean名iCustomerServiceImpl)
由此注解衍生的三个注解和@Component作用一样:
@Controller 一般用于表现层(web层)的注解
@Service 一般用于业务层(service层)的注解
@Repository 一般用于持久层(dao层)的注解
2.用于注入数据的
当我们使用注解注入时,类中可以去掉set方法
@Autowired
作用:自动按照类型注入(spring会在容器中寻找满足被注入对象类型的bean进行注入),当spring容器中这个类型的bean多于一个时,则报错
@Qualifier
作用:在自动按照类型注入的基础之上,再按照bean的id注入。它给类成员注入数据时,不能独立使用(要配合@Autowired)。但是再给方法的形参注入数据时,可以独立使用
属性:
value:用于指定bean的id
@Resource(name = “customerDao”)
作用:直接按照bean的id注入
@Value
作用:用于注入基本类型和String类型。它可以借助spring的el表达式读取properties文件中的配置
3.用于改变作用范围的
@Scope(“prototype”)
作用:用于改变bean的作用范围
属性:
value:用于指定范围的取值
取值和xml中scope属性的取值是一样的。singleton prototype request session globalsession
4.和生命周期相关的
@PostConstruct 相当于 init-method
@PreDestroy 相当于 destroy-method
eg
@Controller("userAction")
public class UserAction {
@Resource(name = "userService")
private UserService userService;
@PostConstruct
public void init(){
System.out.println("初始化方法");
}
public void save(){
System.out.println("action save方法");
userService.add();
}
@PreDestroy
public void destory(){
System.out.println("销毁方法");
}
}
eg
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 告知spring在创建容器时要扫描的包。当配置了此标签之后,spring创建容器就会去指定的包及其子包下找对应的注解
标签是在一个context的名称空间里,所以必须在约束中导入context名称空间
-->
<context:component-scan base-package="com.itheima"></context:component-scan>
</beans>
// 指定类交给spring来创建,指定bean的id为customerService
@Service("customerService")
@Scope("prototype")
public class ICustomerServiceImpl implements ICustomerService {
// @Autowired
// @Qualifier("customerDao")
@Resource(name = "customerDao")
private ICustomerDao customerDao;
@Value("miralce")
private String name;
@Override
public void saveCustomer() {
System.out.println("业务层调用持久层" + name);
customerDao.saveCustomer();
}
}
@Repository("customerDao")
public class ICustomerDaoImpl implements ICustomerDao {
@Override
public void saveCustomer() {
System.out.println("持久层保存了客户");
}
}