1. 概述
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,因此出现了注解开发,注解开发是一种趋势,可以代替xml配置文件,简化配置,提高开发效率
根据注解的出现快慢,国际上将注解开发分为新注解与原始注解:
2. 原始注解
Spring原始注解主要是用来替代<Bean>的配置,主要注解如下:
2.1 类注解:实例化bean:
注解名 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean 在类上增加@Component相当于<bean>与class的配置 再在@Component的值里添加(“id”)就等同于<bean>+id+class |
@Controller | 使用在web层类上用于实例化Bean 是语义化的类注解 效果其实与@Component 是一样的,写给人看的 |
@Service | 使用在service层类上用于实例化Bean 同上 |
@Repository | 使用在dao层类上用于实例化Bean 同上 |
示例:
// <bean id="UserDao" class="com.com.ahua.dao.UserDaoImpl" scope="prototype"/>
@Repository("userDao")
public class UserDaoImpl implements UserDao{
public UserDaoImpl() {
System.out.println("创建成功");
}
@Override
public void select() {
System.out.println("查询成功");
}
}
2.2 bean的属性配置注解:
依赖注入:
注解 | 说明 |
---|---|
@Autowired | 使用在字段上用于根据类型依赖注入,以下三个也都是使用在字段上 表示自动注入,即如果只在字段上加这一个注解,而没加其他注解 那会根据数据类型在spring容器中进行自动匹配 相当于用getBean(类类型),因此含多个同类型的bean时会报错 |
@Qualifier | 必须结合@Autowired一起使用,用于根据名称进行依赖注入 是用于替代ref属性的,在注解中填入要注入对象的bean id 相当于用getBean(“id”)进行匹配获取对象 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 使用这个注解不加参数相当于@Autowired 目前唯一一个通过变量name指定id(只有name,没有value) 相当于@Autowired+@Qualifier 注意:这个注解需要导包:javax.annotation-api |
@Value | 注入普通数据类型,替代value属性 上面的都是注入引用数据类型 主要与JSTL表达式结合(直接在Value的value变量里写JSTL表达式) |
通过@Autowired+@Qualifier或者@Resource注解就不需要set方法或者有参构造方法注入了
@Autowired+@Qualifier代码示例:
// <bean id="UserService" class="com.com.ahua.service.impl.UserServiceImpl">
@Service("userService")
public class UserServiceImpl implements UserService {
// <property name="userDao" ref="UserDao"/>
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Override
public void select() {
userDao.select();
}
}
@Resource注解导包:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
@Resource示例:
// <bean id="UserService" class="com.com.ahua.service.impl.UserServiceImpl">
@Service("userService")
public class UserServiceImpl implements UserService {
// <property name="userDao" ref="UserDao"/>
// @Autowired
// @Qualifier("userDao")
@Resource(name = "userDao")
private UserDao userDao;
@Override
public void select() {
userDao.select();
}
}
作用范围配置:
注解 | 说明 |
---|---|
@Scope | **使用在类上**标注Bean的作用范围 |
示例:
// <bean id="UserDao" class="com.com.ahua.dao.UserDaoImpl" scope="prototype"/>
@Repository("userDao")
@Scope("prototype")
public class UserDaoImpl implements UserDao{
public UserDaoImpl() {
System.out.println("创建成功");
}
@Override
public void select() {
System.out.println("查询成功");
}
}
2.3 初始化/销毁方法配置:
注解 | 说明 |
---|---|
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
2.4 配置组件扫描:
注意:
对于spring的注解开发,必须告诉spring容器创建对象时去注解那里找对象创建, 即在applicationContext.xml中配置组件扫描
作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
配置组件扫描:
<!--注解的组件扫描,需要先使用context命名空间-->
<!-- 表示在com.ahua这个包下需要扫描使用注解配置的类 -->
<!-- base-package表示基本包 -->
<context:component-scan base-package="com.ahua"/>
context命名空间:在根标签的属性中增加命名空间与约束路径:
<!-- 命名空间: -->
xmlns:context="http://www.springframework.org/schema/context"
<!-- 约束路径: -->
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!-- 同时在自带的xsi:schemaLocation约束路径中有beans的约束路径 -->
<!-- 因此我们只需要将自带的copy,将自带的所有的beans修改为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">
同时配置context命名空间与约束路径后,我们可以使用spring容器加载properties配置文件:
<context:property-placeholder location="xx.properties"/>
<property name="" value="${key}"/>
3. 新注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
- 非自定义的Bean的配置(即别人提供的类):<bean>
- 加载properties文件的配置:<context:property-placeholder>
- 组件扫描的配置:<context:component-scan>
- 引入其他文件:<import>
因此引入以下新注解:
注解 | 说明 |
---|---|
@Configuration | 写在类上,用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 写在类上,用于指定 Spring 在初始化容器时要扫描的包 作用和在 Spring 的 xml 配置文件中的 <context:component-scan base-package=“com.itheima”/>一样 |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 默认情况下,@Bean的Id与带有@Bean的方法名一样 同时给该注解变量赋值相当于给返回值变量起名字 |
@PropertySource | 写在类上,用于加载.properties 文件中的配置 |
@Import | 写在核心配置类上,用于导入其他配置类 其中value={},即value是数组,可以加载多个配置类 |
注意:
使用配置类之后需要将加载核心配置文件改为加载核心配置类,来创建spring容器,此时就不需要xml配置文件了,可以进行完全注解开发,示例:
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
(使用spring进行创建druid数据池的代码还需完善)