对Spring Ioc几个注解的使用的理解

8 篇文章 0 订阅

Ioc是控制反转,意味着反转获取资源的方式。传统的资源查找方式是要求组件向容器发起请求查找资源,容器适时的返回资源。 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源。这种行为是查找的被动形式。 .

. DI(Dependency Injection)是IOC 的另一种表述方式:即组件以一些预先定义好的方式接受来自如容器的资源注入。 相对于 IOC 而言,这种表述更直接。这些预先定义好的方式可以是:构造器注入、Setter注入和使用注解注入等常用的3种方式。

. 构造器注入,就是将要注入的成员变量放进构造函数中,并在类被初始化的时候进行注入。构造器注入需要配置构造函数的参数。在<constructor-arg ref="constructor"></constructor-arg>中的ref元素中写入要被注入的bean。
setter注入,顾名思义就是在setter方法中放入成员变量。注入的时候会自动调用这个set方法对成员变量进行赋值。并且在配置文件中使用property注入对象<property name="property" ref="property"/>
中的ref元素写入要被注入的bean。
使用注解注入,顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。

Autowired是自动注入,自动从spring的上下文找到合适的bean来注入,能用在方法上。将Autowired 的required属性设置为false时, Spring会尝试执行自动装配,但是如果没有匹配的bean的话, Spring将会让这个bean处于未装配的状态。如果代码中没有进行null检查的话,这个处于未装配状态的属性有可能会出现NullPointerException。如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配。
Resource用来指定名称注入。

Qualifier和Autowired配合使用,指定bean的名称。Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个同一类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在此类型的bean,也会抛出BeanCreationException异常。我们可以使用Qualifier配合Autowired来解决这些问题。

Service,Controller,Repository分别标记类是Service层类,Controller层类,数据存储层的类,spring扫描注解配置时,会标记这些类要生成bean。
Component是一种泛指,标记类是组件,spring扫描注解配置时,会标记这些类要生成bean。

上面的Autowired和Resource是用来修饰字段,构造函数,或者设置方法,并做注入的。而Service,Controller,Repository,Component则是用来修饰类,标记这些类要生成bean。
说到使用注解注入,顺便说一下Spring实现自动化装备的两种方式:
组件扫描(component scanning) : Spring会自动发现应用上下文中所创建的bean。
自动装配(autowiring) : Spring自动满足bean之间的依赖。
组件扫描:Spring应用上下文中所有的bean都会给定一个ID。 Spring会根据类名为其指定一个ID。 具体来讲,是将类名的第一个字母变为小写。
@ComponentScan的value属性中指明包的名称,即@ComponentScan(“packageName”)。或者使用basePackages属性进行配置,这样可以更加清晰表示你所设置的是基础包。即@ComponentScan(basePackages =“packageName”)。basePackages属性可以使用复数形式,只需要将basePackages属性设置为要扫描包的一个数组即可。即@ComponentScan(basePackages ={“packageName”,”packageName1”})。
@ComponentScan basePackageClasses属性所设置的数组中包含了类,就不再使用String类型的名称来指定包。 这些类所在的包将会作为组件扫描的基础包。可以使用@Configuration注解定义配置类,之后方可使用ComponentScan注解。
自动装配就是让Spring自动满足bean依赖的一种方法, 在满足依赖的过程中, 会在Spring应用上下文中寻找匹配某个bean需求的其他bean。
顺便提一下Bean注解,Bean注解会告诉Spring这个方法将会返回一个对象, 该对象要注册为Spring应用上下文中的bean。默认情况下, bean的ID与带有@Bean注解的方法名是一样的。想为其设置成一个不同的名字的话, 那么可以重命名该方法, 也可以通过name属性指定一个不同的名字,即@Bean(name=”bean”)。
无参方法上添加了Bean注解,Spring将会拦截所有对它的调用, 并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用。
最后说一下Spring容器,Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。Spring自带了多个容器实现, 可以归为两种不同的类型。 bean工厂(由org.springframework. beans.factory.eanFactory接口定义) 是最简单的容器, 提供基本的DI支持。 应用上下文(由org.springframework.context.ApplicationContext接口定义) 基于BeanFactory构建, 并提供应用框架级别的服务, 例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
从中可以得出:Spring有两种类型的容器:一种是bean工厂,一种是应用上下文,都是通过容器来加载配置文件获取bean的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值