【浅学Spring框架--自动装配与注解】

本文主要介绍IOC的自动装配和IOC的注解有关内容。


一、自动装配

自动装配:Spring在实例化当前bean的时候从Spring容器中找到匹配的实例赋值给当前bean的属性

自动装配策略有两种:

  • byName 根据当前Bean的属性名在Spring容器中寻找匹配的对象 ,如果根据name找打了bean但是类型不匹配则抛出异常
<bean id="clazz" class="com.etime.Clazz"></bean>

<bean id="stu2" class="com.etime.Student" autowire="byName"></bean>

注意:byName:根据在 Person 类中所定义的属性名称进行自动装配,这个时候,需要类中的属性名称和配置文件中的 bean 的 id 一致方可进行自动装配。如果名称不一致,不能进行装配,那么该属性的值为 Null

  • byType 根据当前Bean的属性类型在Spring容器中寻找匹配的对象,如果根据类型找到了多个bean也会抛出异常
<bean id="clazz2" class="com.etime.Clazz"></bean>

<bean id="stu2" class="com.etime.Student" autowire="byType"></bean>

注意:使用 byType 进行自动装配,需要 IOC 容器中的同类型的 bean 只能有一个。如果同类型的 bean 有多个,这是 Spring 将无法识别是哪一个 bean。将无法自动状态。

XML 配置里的 Bean 自动装配的缺点:
在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了. autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之. 一般情况下,在实际的项目中很少使用自动装配功能(配置文件中的自动装配),因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些

二、 Bean的作用域

在bean标签可以通过scope属性指定对象的的作用域

  • scope=“singleton” 表示当前bean是单例模式(默认饿汉模式,Spring容器初始化阶段就会完成此对象的创建;当在bean标签中设置 lazy-init="true"变为懒汉模式)
  • scope=“prototype” 表示当前bean为非单例模式,每次通过Spring容器获取此bean的对象时都会创建一个新的对象
    代码如下(示例):
  • 单例
<bean id="student" class="com.etime.Student" scope="singleton" lazy-init="true"></bean>
  • 多例
<bean id="student" class="com.etime.Student" scope="prototype"></bean>

注意:singleton单例的时候是非线程安全的,prototype是线程安全的,默认是单例的。

三、 IOC 容器中Bean 的生命周期方法

Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进行管理的过程:
1.通过构造器或工厂方法创建 Bean 实例
2.为 Bean 的属性设置值和对其他 Bean 的引用
3.调用 Bean 的初始化方法
4.Bean 可以使用了
5.当容器关闭时, 调用 Bean 的销毁方法
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为Bean 指定初始化和销毁方法.

public class Student {

    private int StudentId;
    private String StudentName;

     //初始化方法:在创建当前类对象时调用的方法,进行一些资源准备工作
    public void init(){
        System.out.println("-------init");
    }

    //销毁方法:在Spring容器销毁对象时调用此方法,进行一些资源回收性的操作
    public void destory(){
        System.out.println("-------destory");
    }
}

Spring配置文件

<bean id="student" class="com.etime.Student" scope="prototype"init-method="init" destroy-method="destory" ></bean>

四、spring 的注解

1,创建Spring配置文件

因为Spring容器初始化时,只会加载applicationContext.xml文件,那么我们在实体类中添加的注解就不会被Spring扫描,所以我们需要在applicationContext.xml声明Spring的扫描范围`,以达到Spring初始化时扫描带有注解的实体类并完成初始化工作

<!-- 声明使用注解配置 -->
    <context:annotation-config/>

<!-- 声明Spring工厂注解的扫描范围 -->
    <context:component-scan base-package="com.etime.Student"/>

2,创建Spring配置文件

#IoC常用注解

2.1 @Component
  • 类注解,声明此类被Spring容器进行管理,相当于bean标签的作用
  • @Component(value="student") value属性用于指定当前bean的id,相当于bean标签的id属性;value属性也可以省略,如果省略当前类的id默认为类名首字母改小写
  • 除了@Component之外 @Service、@Controller、@Repository这三个注解也可以将类声明给Spring管理,他们主要是语义上的区别
  • 1.@Controller 注解主要声明将控制器类配置给Spring管理,例如Servlet
  • 2.@Service 注解主要声明业务处理类配置Spring管理,Service接口的实现类
  • 3.@Repository 直接主要声明持久化类配置给Spring管理,DAO接口
  • 4.@Component 除了控制器、servcie和DAO之外的类一律使用此注解声明
2.2 autowired 注解

@Autowired 注解自动装配具有兼容类型的单个 Bean 属性。

  • 首先使用类型进行匹配,如果同类型的 bean 有多个,那么再采用名称进行匹配,如果名称匹配不上,那么就会抛出异常
  • 构造器, 普通字段(即使是非 public), 一切具有参数的方法都可用@Autowired 注解
  • 默认情况下, 所有使用 @Autowired 注解的属性都需要被设置. 当Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置@Autowired 注解的 required 属性为 false
  • 默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时, 通过类型的自动装配将无法工作。如果 ioc 容器中包含多个兼容类型的 bean,则@AutoWired 注解还会根据变量名与 bean 的名称进行自动装配。
  • @Autowired 注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的Bean 进行自动装配. @Autowired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean.
  • @Autowired 注解用在 java.util.Map 上时, 若该 Map 的键值为String, 那么Spring将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值

总结

注解的类型还有很多上面我仅仅写出了我所学习的,有所了解的内容。后面文章会继续介绍。
注意:此文章为学习记录文章,参考多篇文章,如有不正之处请指教

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值