(十一)Spring 基础注解(对象创建相关注解、注入相关注解)

注解编程

目录


 

 

注解基础概念

什么是注解编程

  • 在 类 或者 方法 上加入特定的注解(@xxx),完成特定功能的开发。
@Component
public class XXX{}

为什么要学习注解编程

  1. 注解开发方便,代码简单, 开发速度大大提高。
  2. 注解开发是 Spring 开发潮流
    Spring 2.x 引入注解,Spring 3.x 完善注解,SpringBoot 普及、推广 注解编程。

注解的作用

替换 XML 这种配置形式,简化配置。
在这里插入图片描述
替换接口,实现调用双方的契约性。

  • 通过注解的方式,在功能调用者和功能提供者之间达成契约,进而进行功能的调用。因为注解的应用的更为方便灵活,所以在现在的开发中,更推荐通过注解的方式完成。
    在这里插入图片描述

Spring 注解的发展历程

  1. Spring 2.x: 开始支持注解编程 @Component@Service@Scope
    目的:提供的这些注解只是为了某些 XML 的配置,作为 XML 开发的有益补充。
  2. Spring 3.x: @Configuration@Bean
    目的:彻底替换 XML,基于纯注解
  3. 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 注解 基于类型进行注入 [推荐]
注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)

@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 中

JDK 类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

军刀0923

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值