注解编程
目录
- 注解基础概念
- 注解的作用
- Spring 注解的发展历程
- Spring 基础注解(Spring 2.x)
- 对象创建相关注解
- @Component
- @Repository、@Service、@Contoller
- @Scope
- @Lazy
- 生命周期注解 @PostConstruct、@PreDestroy
- 注入相关注解
- 用户自定义类型 @Autowired
- JDK 类型
注解基础概念
什么是注解编程?
- 在 类 或者 方法 上加入特定的注解(
@xxx
),完成特定功能的开发。
@Component
public class XXX{}
为什么要学习注解编程?
- 注解开发方便,代码简单, 开发速度大大提高。
- 注解开发是 Spring 开发潮流
Spring 2.x 引入注解,Spring 3.x 完善注解,SpringBoot 普及、推广 注解编程。
注解的作用
替换 XML 这种配置形式,简化配置。
替换接口,实现调用双方的契约性。
- 通过注解的方式,在功能调用者和功能提供者之间达成契约,进而进行功能的调用。因为注解的应用的更为方便灵活,所以在现在的开发中,更推荐通过注解的方式完成。
Spring 注解的发展历程
- Spring 2.x: 开始支持注解编程
@Component
、@Service
、@Scope
…
目的:提供的这些注解只是为了某些 XML 的配置,作为 XML 开发的有益补充。 - Spring 3.x:
@Configuration
、@Bean
…
目的:彻底替换 XML,基于纯注解 - Spring 4.x: SpringBoot 提倡使用注解进行开发
Spring 基于注解进行配置后,还能否解耦合呢?
- 在 Spring 框架应用注解时,如果对注解配置的内容不满意,可以通过 Spring 配置文件覆盖。
Spring 基础注解(Spring 2.x)
这个阶段的注解,仅仅是简化 XML 的配置,并不能完全替代 XML。
对象创建相关注解
@Component
作用:替换原有 Spring 配置文件中的 <bean>
标签
id
属性:在@Component
中提供了默认的设置方式,首字母小写(UserDAO --> userDAO)class
属性:通过反射获得的class
的内容
@Component
细节:
- 如何显式指定工厂创建对象的 id 值
@Component("u")
- Spring 配置文件覆盖注解配置内容
applicationContext.xml
<bean id="user" class="com.yusael.bean.User"><property name="id" value="10"/>
</bean>
id值、class值 要和 注解 中配置的一样才会覆盖,
否则 Spring 会创建新的对象。
@Repository、@Service、@Contoller
@Repository
、@Service
、@Controller
都是 @Component
的 衍生注解。
本质上这些衍生注解就是 @Component
,通过源码可以看见他们都使用了 @Component
;
它们的存在是为了:更加准确的表达一个类型的作用。
@Repository
public class UserDAO {}@Service
public class UserService {}@Controller
public class UserController {}
注意:Spring 整合 Mybatis 开发过程中,不使用 @Repository
、@Component
@Scope
作用:控制简单对象创建次数
注意:不添加 @Scope
,Spring 提供默认值 singleton
XML 配置:
<bean id="customer" class="com.yusael.Customer" scope="singleton | prototype"/>
注解:
创建单例对象
@Component
@Scope("singleton")
public class Customer {}创建多例对象
@Component
@Scope("prototype")
public class Customer {}
@Lazy
作用:延迟创建单实例对象
注意:一旦使用 @Lazy
注解后,Spring 会在使用这个对象的时候,再创建这个对象。
XML 配置:
<bean id="account" class="com.yusael.Account" lazy="true"/>
注解:
@Component
@Lazy
public class Account {public Account() {System.out.println("Account.Account");}
}
生命周期注解 @PostConstruct、@PreDestroy
初始化相关方法: @PostConstruct
InitializingBean
<bean init-method=""/>
销毁方法:@PreDestory
DisposableBean
<bean destory-method=""/>
注意:
- 上述的两个注解并不是 Spring 提供的,由 JSR(JavaEE规范)520 提供
- 再次验证,通过注解实现了接口的契约性
注入相关注解
用户自定义类型 @Autowired
@Autowired
注解 基于类型进行注入 [推荐]
注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)
@Autowired
private UserDAO userDAO;
@Autowired
、@Qualifier
注解联合实现 基于名字进行注入 [了解]
注入对象的 id 值,必须与 @Qualifier
注解中设置的名字相同
@Autowired
@Qualifier("userDAOImpl")
private UserDAO userDAO;
@Autowired
注解放置位置
- 放置在对应成员变量的 setter 方法上,调用 setter 方法赋值
- 直接放置在成员变量上,Spring 通过反射直接对成员变量进行赋值 [推荐]
JavaEE 规范中类似功能的注解
- JSR250 提供的
@Resource(name="userDAOImpl")
基于名字进行注入,
等价于@Autowired
与@Qualifier
联合实现的效果。
注意:@Resource
注解如果名字没有配对成功,会继续 按照类型进行注入。 - JSR330 提供的
@Injection
作用与@Autowired
完全一样,一般用在 EJB3.0 中