准备
1、要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop
支持包,如下:
2、在 applicationContext.xml
中引入 context
约束:
<?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-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 下可以找到-->
</beans>
简单使用
1、创建测试 Dao 接口:
// com.zze.dao.UserDao
package com.zze.dao;
public interface UserDao {
void save();
}
2、创建 Dao 接口的实现类并使用注入注解:
// com.zze.dao.impl.UserDaoImpl
package com.zze.dao.impl;
import com.zze.dao.UserDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 实例化当前类并将其交给 Spring 管理
* 相当于在配置文件中配置 <bean id="userDao" class="com.zze.dao.impl.UserDaoImpl"/>
*/
@Component("userDao")
public class UserDaoImpl implements UserDao {
/*
给属性注入值
*/
@Value("张三")
private String name;
/*
如果提供了 set 方法,则可在 set 方法上加上注解
*/
// @Value("张三")
// public void setName(String name) {
// this.name = name;
// }
@Override
public void save() {
System.out.println("from UserDaoImpl.save()" + name);
}
}
3、配置注解扫描包:
<!-- 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">
<!--使用 IoC 注解开发,配置注解扫描的包(哪些包下使用了 IoC 注解)-->
<context:component-scan base-package="com.zze.dao"/>
</beans>
4、测试使用:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
常用注解
Spring 提供的常用基础注解大致可以分为如下几类:
注册 Bean 到容器
@Component
:修饰一个类,将这个类实例交给 Spring 管理。@Controller
:@Component
的衍生注解,功能与之相同,用来修饰 Web(显示)层的类。@Service
:@Component
的衍生注解,功能与之相同,用来修饰 Service(服务)层的类。@Repository
:@Component
的衍生注解,功能与之相同,用来修饰 Dao(持久)层的类。
属性注入
@Value
:给基本类型属性注入值。@Autowried
:默认是按照类型在 IoC 容器中找到对应的实例注入。如果想按照名称匹配完成属性注入,可以同时再使用一个注解@Qualifier
来指定要注入对象的名称。
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Resource
:可以看做是 @Autowried
和 @Qualifier
注解的结合体。默认不指定 name
属性时是根据对象类型匹配完成属性注入,指定了 name
属性时则会按照 name
值在 IoC 容器找到指定 name
的实例注入。
@Resource(name = "userDao")
private UserDao userDao;
生命周期
@PostConstruct
:修饰一个方法,让其在实例化时执行,相当于在bean
标签中指定init-method
。@PreDestroy
:修饰一个方法,让其在实例销毁之前执行,相当于在bean
标签中指定destroy-method
。
作用范围
@Scope
:修饰一个类,指定其作用范围。
value
有如下几个可选值:
singleton
:默认值,Spring 会采用单例模式创建这个对象。prototype
:多例的。request
:应用在 web 项目中,Spring 创建这个类对象后,将这个对象存放到request
范围中。session
:应用在 web 项目中,Spring 创建这个类对象后,将这个对象存放到session
范围中。globalsession
:应用在 web 项目中,必须在 porlet 环境下使用。
IoC 的 XML 和注解配置对比
- XML 方式:结构清晰,维护方便,适用于任意场景。
- 注解方式:简易开发,当一个类不是自己编写而是由第三方提供时,不可以使用。
评论区