那些年我们一起着迷的Spring:初始化与注入方式(三)

参考慕课网视屏和慕课网上笔记
专题一:IOC ---- Spring入门
spring学习手册记录本

参考spring面试题及答案解析(7)


Spring的Bean配置

在Spring中,它把所有的对象都称作为Bean
Spring的配置:1.基于XML的配置;2.注解方式@Autowired ;3.java类@configuration

基于.xml的文件配置(如spring-ioc.xml)
注解(如 Component通用注解、Respority持久层、Service服务层、Controller控制层等)

那些年我们一起着迷的Spring:初始化与注入方式(三)_第1张图片
示例 xml中关于bean的配置

 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd" >
	<bean id="oneInterface" class="com.imooc.ioc.interfaces.OneInterfaceImpl">bean> 
	<--id="oneInterface(自定义)" class="配置的实现类"-->
 beans>

使用示例:

//部分测试方法
public void test(){
	OneInterface interface=super.getBean("oneInterface");//根据id获取bean,不需要new对象
	interface.hello();//调用函数
}

Bean 容器的初始化

基础:两个包
org.springframework.beans
org.springframework.context
BeanFactory 提供配置结构和基本功能,加载并初始化 Bean
ApplicationContext 保存了 Bean 对象并在 Spring 中广泛使用

3种初始化方式:ApplicationContext

本地文件

FileSystemXmlApplicationContext context = new 
FileSystemXmlApplicationContext("F:/workspace/appcontext.xml");

Classpath

ClassPathXmlApplicationContext context = new 
ClassPathXmlApplicationContext("classpath:spring-context.xml");

Web 应用中依赖 servlet 或 Listener
那些年我们一起着迷的Spring:初始化与注入方式(三)_第2张图片
Spring系列之beanFactory与ApplicationContext -内容介绍的详细

BeanFactory 和ApplicationContext的区别

BeanFactory和ApplicationContext都是接口,并且ApplicationContext是BeanFactory的子接口

BeanFactory是Spring中最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能。而ApplicationContext是Spring的一个更高级的容器,提供了更多的有用的功能。

ApplicationContext提供的额外的功能:国际化的功能、消息发送、响应机制、统一加载资源的功能、强大的事件机制、对Web应用的支持等等。

加载方式的区别:BeanFactory采用的是延迟加载的形式来注入Bean;ApplicationContext则相反的,它是在IOC启动时就一次性创建所有的Bean,好处是可以马上发现Spring配置文件中的错误,坏处是造成浪费。


注入方式

Spring 注入指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
常用的两种注入方式

  • 设值注入property(set方法)
  • 构造注入constructor-arg(构造方法)
  • 接口注入、注解注入等

设值注入
IOC容器在实例化bean的时候,会根据ref属性,把另一个bean的实例对象通过set()方法赋值给该name属性指定的成员变量.
那些年我们一起着迷的Spring:初始化与注入方式(三)_第3张图片

InjectionDaoImpl.java
那些年我们一起着迷的Spring:初始化与注入方式(三)_第4张图片

InjectionServiceImpl.java
那些年我们一起着迷的Spring:初始化与注入方式(三)_第5张图片
注意:需要在 Service 文件中添加 setInjectionDAO 方法。property 中 name 对应当前成员变量的名称

构造注入constructor-arg

 <bean id="injectionService" class="com.zjx.service.impl.InjectionServiceImpl">
        <constructor-arg name="injectionDao" ref="injectionDao">constructor-arg>
 bean>

 <bean id="injectionDao" class="com.zjx.dao.impl.InjectionDaoImpl">bean>

IOC容器在实例化bean的时候会根据ref属性把另一个bean的实例对象通过构造方法赋值给name属性指定的成员变量.
配置文件中 property改为 constructor-arg
使用构造注入前提必须在此bean对应的类中存在构造方法.且构造方法的参数必须与类中成员变量一致.
注意:需要在 Service 文件中添加构造方法。name 对应 service 中 构造器参数名

public class InjectionServiceImpl implements InjectionService {
    private InjectionDao injectionDao;
    /**
     * @param injectionDao 持久化接口
     * 构造器注入
     */
    public InjectionServiceImpl(InjectionDao injectionDao) {
        this.injectionDao = injectionDao;
    }

那些年我们一起着迷的Spring:初始化与注入方式(三)_第6张图片

  1. set注入与传统的JavaBean的写法更相似,易理解、接受,通过setter方式设定依赖关系显得更加直观、明显;
  2. 对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而会产生浪费。而使用设置注入,则避免这些问题;
  3. 在某些属性可选的情况下,多参数的构造器更加笨拙,官方更鼓励使用设值注入。
  4. 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入
  5. 对于依赖关系无须变化的Bean,构造注入更有用处,因为没有setter方法,所有的依赖关系全部在构造器内设定,因此,不用担心后续代码对依赖关系的破坏。
  6. 构造注入使依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系,更符合高内聚的原则。
  7. 设值注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值
  8. 建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用set注入。

注解注入

注解注入其实是使用注解的方式进行构造器注入或者set注入。

spring2.5开始提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入。

@Resource和@Autowired的区别:

  • @Resource默认是按照**名称(id)来装配注入的,只有当找不到与名称匹配的bean才会按照类型(class)**来装配注入;
  • @Autowired默认是按照类型装配注入的,如果想按照名称来注入,则需要结合@Qualifier一起使用;
  • @Resource注解是又J2EE提供,而@Autowired是由Spring提供;

Bean 的自动装配(Autowiring) (自动注入)

default-autowire="no/byName/byType/constructor "
作用:省去了在Spring的xml中配置property标签和constructor-arg标签,只需要配置bean标签即可.

 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd" 
default-autowire="constructor"> 
	<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService">
		<--以前的property、constructor-arg 标签name="" ref="" 都可以省略了-->
	bean> 
	<--byName是通过id-->
	<bean  id="AutoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" >bean> 
	
	<--byType和constructor是通过class,可以不用配置id-->
	<bean  class="com.imooc.autowiring.AutoWiringDAO" >bean> 
beans>

(1. No:不做任何操作
(2. byname:【检查ID】根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean ,并将其与属性自动装配【设值注入省去编写property 】
(3. byType:【检查Class】如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配; 如果存在多个该类型bean,那么抛出异常,并指出不能使用不byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生【设值注入省去编写property 】
(4. Constructor:【检查Class】与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没 有找到与构造器一致的bean,那么抛出异常【构造注入省去constructor-arg】

byName和byType方式
那些年我们一起着迷的Spring:初始化与注入方式(三)_第7张图片

byName和byType设置注入方式,Constructor构造器方式
byName要求bean标签的id属性需要和成员变量的名称一致【如果没找到对应的id 也不会报错 】(如果有2个相同的id,ioc容器会启动失败)
byType和constructor则跟id无关,跟class类型相关

你可能感兴趣的:(spring)