学习基于注解的 IOC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 , 所以这两种配置方式我们都需要掌握。
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
1、Spring 2.5版本
注意:
在2.5版本中使用注解进行开发时,需要在application.xml中配置组件扫描
,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
1.1、使用Component定义bean
//dao层接口
public interface UserDao {
void show();
}
//dao层实现类
@Component //通过类型定义bean(只有一个实现类建议使用)
// @Component("ud") //通过id定义bean
public class UserDaoImpl implements UserDao {
@Override
public void show() {
System.out.println("这是userDao的方法");
}
}
1.2、核心配置文件中通过组件扫描加载bean
<context:component-scan base-package="com.liming"/>
1.3、Spring提供@Component注解的三个衍生注解
// 持久层
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void show() {
System.out.println("这是userDao的方法");
}
}
// 业务层
@Service
public class UserServiceImpl implements UserService {
@Override
public void show() {
System.out.println("这是userDao的方法");
}
}
// 表现层
@Controller
public class UserController {
}
2、纯注解开发(Spring 3.0版本)
Spring 3.0 开启了纯注解开发模式,使用
Java类替代配置文件
,开启了Spring快速开发赛道
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解,作用等价于applicationContext.xml 配置文件。 |
@ComponentScan | 用于指定 Spring在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 |
2.2、初始化容器对象
读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
注解 | 说明 |
---|---|
@Value | 注入简单类型 |
@Autowired | 自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。 如果IOC容器当中有多个接口得实现类, 首先根据类型自动装配, 然后再根据名称自动装配。 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入,是java提供的,不是框架提供的 |
2.1、使用@Autowired注解开启自动装配模式(按类型)
//@Component
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void show() {
userDao.show();
}
}
2.2、使用@Qualifier注解开启指定名称装配bean
//@Component
@Service
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("ud")
private UserDao userDao;
@Override
public void show() {
userDao.show();
}
}
注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用
2.3、使用@Resource注解开启指定名称装配bean
//@Component
@Service
public class UserServiceImpl implements UserService {
@Resource(name = "ud")
private UserDao userDao;
@Override
public void show() {
userDao.show();
}
}
2.4、使用@Value注解注入普通类型
@Repository
public class UserDaoImpl implements UserDao {
@Value("字符串")
private String str;
public void addUser() {
System.out.println(str);
}
}
注解 | 说明 |
---|---|
@PropertySource | 用于加载xxx.properties 文件中的配置 结合@Value(“${}”) 取配置文件的值。 |
@Configuration
@ComponentScan("com.liming")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
}
注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*
4.1、使用独立的配置类管理第三方bean
4.2、将独立的配置类加入核心配置
注解 | 说明 |
---|---|
@Import | 用于导入其他配置类 |
5.1、引用类型依赖注入
注意:引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
注解 | 说明 |
---|---|
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
//@Component
@Repository
public class UserDaoImpl implements UserDao {
@PostConstruct
public void init(){
System.out.println("userDao被初始化了");
}
@Override
public void show() {
System.out.println("这是userDao的方法");
}
@PreDestroy
public void destroy(){
System.out.println("userDao被销毁了");
}
}
注解 | 说明 |
---|---|
@Scope | 标注Bean的作用范围,scope取值singleton prototype request session globalsession |