1 IOC注解开发入门
1.1 创建web项目,引入jar包
在Spring3的版本,只要引入基本包(https://blog.youkuaiyun.com/W2612888/article/details/85217984)即可,但是在Spring4的版本中,除了引入基本的开发包之外,还需要引入aop的包
1.2 引入Spring的配置文件
创建配置文件并引入context约束(注解开发需要),具体的约束在xsd-configuration.xml中找
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">
1.3 开启Spring的组件扫描
<!-- 使用IOC注解开发,配置组件扫描(配置哪些包下的类使用IOC的注解) -->
<context:component-scan base-package="com.itykd.dao.impl"/>
1.4 创建接口、实现类以及注解
- 接口
package com.itykd.dao;
public interface UserDao {
void save();
}
- 实现类和注解
@Component("userDao") 相当于<bean id="userDao" class="com.itykd.dao.userDaoImpl" />
package com.itykd.dao.impl;
import org.springframework.stereotype.Component;
import com.itykd.dao.UserDao;
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDaoImpl的save方法执行了.....");
}
}
1.5 编写测试方法
public void demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
userDao.save();
}
2 Spring IOC注解的详解
2.1 @Component:组件
@Component用来修饰一个类,并将这个类交给Spring管理
这个注解有三个衍生注解:
- @Controller :修饰web层的类
- @Service :修饰service层的类
- @Repository:修饰dao层的类
2.2 属性注入的注解
2.2.1 普通属性
基本数据类型的注入用@Value,这种方式是按照名称的属性注入的形式(如下图所示的xml配置就是按照名称注入的形式)
2.2.2 对象类型属性
对象类型的属性的值用@Autowired,这个默认采用的是按照类型完成属性注入的形式(如下面两个图所示)
UserService的实现类依赖UserDao,尽管他们的名称不一样,但是依然能够注入,这就是按照类型完成的属性注入
尽管按照类型也能完成属性注入, 但是我们习惯是按照名称完成属性注入,这个时候必须让@Autowired和@Qualifier一起使用(强制按照名称,如下图所示,如果下图两个名字不相同,则无法注入属性)
当然也可以用@Resource代替@Autowired和@Qualifier共同使用,即可以按照名称完成对象类型的属性的注入
2.3 bean的其他的注解
2.3.1 生命周期的注解
- @PostConstruct:初始化方法
- @preDestroy:销毁方法
@PostConstruct
public void init() {
System.out.println("userService初始化了.....");
}
@PreDestroy
public void destroy() {
System.out.println("userService销毁了.....");
}
2.3.2 作用范围的注解
@scope:作用范围的注解 比如:@Scope("prototype")
- singleton:单例,默认
- prototype:多例
- request
- session
- globalsession
3 IOC的XML和注解方式的比较
3.1 XML和注解的比较
- XML:可以适用任何场景
- 注解:有些地方用不了,这个类不是自己提供的(不是自己写的,不可能在别人的源码上加注解,比如SSH的整合中,不能在相应的源代码中进行注解,这时候就需要利用XML方式)。
- XML方式结构清晰,维护方便,而注解的优点就是开发方便
3.2 XML和注解的整合开发
- 由XML文件管理bean,注解完成属性注入,这样结构清晰,也节省了代码
3.2.1 整合开发的示例
- 在applicationContext.xml开启注解属性,将上述Spring的组件扫描标签注释。
<!-- 开启注解属性 -->
<context:annotation-config />
- 在applicationContext.xml中配置bean
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用IOC注解开发,配置组件扫描(配置哪些包下的类使用IOC的注解) -->
<!-- <context:component-scan base-package="com.itykd"/> -->
<!-- 开启注解属性 -->
<context:annotation-config />
<bean id="userService" class="com.itykd.service.impl.UserServiceImpl"/>
<bean id="userDao" class="com.itykd.dao.impl.UserDaoImpl" />
<bean id="customerDao" class="com.itykd.dao.impl.CustomerDaoImpl"/>
</beans>
- 为类中的属性添加注解
import javax.annotation.Resource;
import com.itykd.dao.CustomerDao;
import com.itykd.dao.UserDao;
import com.itykd.service.UserService;
public class UserServiceImpl implements UserService{
@Resource(name="userDao")
private UserDao userDao;
@Resource(name="customerDao")
private CustomerDao customerDao;
@Override
public void save() {
System.out.println("UserService的save方法执行了....");
userDao.save();
customerDao.save();
}
}
- 测试代码
public void demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)applicationContext.getBean("userService");
userService.save();
}