spring实战第二章小记-装配bean

时间:2020/02/06

一.思想

1.创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质。

对于上面这句话的个人理解:当我们在new一个对象时如果传入了别的对象作为参数(这个对象可能是引用数据类型也可能是基本数据类型),这时两个对象之间就形成了一种依赖关系,由于这种依赖关系的存在,两个对象之间就是一种强耦合的关系,而通过依赖注入可以降低两个对象之间的耦合度,注意,不是消除,如果两个对象之间没有耦合关系,那两个对象就是完全没有关系的。

2.spring框架提供了三种主要的装配机制:

  • 在XML中进行显式配置
  • 在Java中进行显示配置
  • 隐式的bean发现机制和自动装配

3.关于上面三种方式的优先级(作者的意思,你可以根据自己的喜爱选择):

隐式的bean发现机制和自动装配>在Java中进行显示配置>在XML中进行显示装配

4.spring从两个角度来实现自动化装配:

  • 组件扫描:spring会自动发现应用上下文中所创建的bean。
  • 自动装配:spring自动满足bean之间的依赖。

5.自动装配:自动装配就是让spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在spring应用上下文中寻找匹配某个bean需求的其他bean。

6.在进行显式配置时,JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好。

7.默认情况下,spring中的bean都是单例的。

8.在XML中声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:

  • <constructor-arg>元素
  • 使用spring3.0所引入的c-命名空间

9.对于DI来说,有的时候是指类型的装配——也就是将对象的引用装配到依赖于它们的其他对象之中。而有的时候,我们需要做的只是用一个字面量来配置对象(基本类型对象以及String类型对象)。

10.在装配bean引用和字面量值方面,<constructor-arg>和c-命名空间的功能是相同的。但是c-命名空间无法将集合装配到构造器参数中。

11.该选择构造器注入还是属性注入(Setter方法注入)呢?作为一个通用的规则,对强依赖使用构造器注入,而对可选择的依赖使用属性注入。

12.spring框架的核心是spring容器,整个容器中存放的东西可以看作key-value对,key是bean的id,value是bean的对象。

二.在XML中进行显示装配

1.spring的XML配置文件的根元素(最基本的约束):

<?xml version="1.0" encoding="UTF-8"?>
<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>

2.使用XML来启用组件扫描,使用spring context命名空间的<context:component-scan>元素。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="soundsystem"/>
</beans>

3.<bean>:  <bean>元素类似于JavaConfig中的@Bean注解。

<bean class="sdnu.machi.one"/>

创建这个bean的类通过class属性来指定,并且要使用全限定的类名。

因为没有明确给定ID,所以这个bean将会根据全限定类名来进行命名。在上述代码中,bean的id将会是"sdnu.machi.one#0"。其中,"#0"是一个计数的形式,用来区分相同类型的其他bean。如果你声明了另外一个one,并且没有明确进行标识,那么它自动得到的id将会是”sdnu.machi.one#1"。

通常来将更好的办法是借助id属性,为每个bean设置一个你自己选择的名字。

当spring发现这个<bean>元素时,它将会调用one的默认构造器来创建bean。(如果这时没有默认构造函数会报错)。

4.<constructor-arg>:  通过该元素可以在XML中实现依赖注入。如下

<bean id="one" class="sdnu.machi.one">
    <constructor-arg ref="two" />
</bean>

当spring遇到这个<bean>元素时,它会创建一个one实例。<constructor-arg>元素会告知spring要将一个id为two的bean引用传递到one的构造器中(有参构造器)。

该元素还有value属性,通过该属性表明给定的值要以字面量的形式注入到构造器中。

5.c-命名空间: 它是在XML中更为简洁的描述构造器参数的方式。要使用它的话,必须要在XML的顶部声明其模式,如下:

xmlns:c="http://www.springframework.org/schema/c"

添加了命名空间和模式声明后,我们就可以使用它来声明构造器参数了,如下所示:

<bean id="one" class="sdnu.machi.one" c:cd-ref="two"/>

除了使用构造器参数名外,我们也可以使用参数在整个参数列表中的位置信息:

c:_0-ref:"two"

将参数的名称换成了“0”,也就是参数的索引,因为在XML中不允许数字作为属性的第一个字符,因此必须要添加一个下划线作为前缀。

在这里因为只有一个构造器参数,所以我们还有另外一种方案——根部不用去标示参数:

c:_-ref="two"

如果要注入的是字面量(基本数据类型以及string类型),参考代码如下:

c:_title="machi"
c:_content="is a good boy"

title和content是参数名,也可以通过索引进行装配,如下:

c:_0="machi"
c:_1="is a good boy"

下划线后面的数字指明了参数的索引。

6.<list>:  当需要注入集合时,可以在<constructor-arg>元素中使用<list>元素来声明列表,如下:

<constructor-arg>
    <list>
        <value>machi</value>
        <value>is</value>
        <value>a</value>
        <value>good</value>
        <value>boy</value>
    </list>
</constructor-arg>

<list>元素是<constructor-arg>的子元素,这表明一个包含值的列表将会传递到构造器中。其中,<value>元素用来指明列表中的每个元素。

我们也可以使用<ref>元素代替<value>,实现bean引用列表的装配。

<ref bean="id名“/>

7.<set>:  与<list>元素作用相同。

8.<property>:  <property>元素为属性的Setter方法所提供的功能与<constructor-arg>元素为构造器所提供功能是一样的。它也有ref属性。

9.p-命名空间:  作为<property>元素的代替方案。为了启用p-命名空间,必须要在XML文件中与其他的命名空间一起对其进行声明:

xmlns:p="http://www.springframework.org/schema/p

使用方式如下:

p:compactDisc-ref="compactDisc"

示例代码:

10.<import>:  在XML中,可以使用import元素来拆分XML配置

三.在Java中进行显式装配

其实就是JavaConfig类,需要和注解一起使用。

四.隐式的bean发现机制和自动装配(基于注解的隐式装配)

[email protected]:  在类上使用@Component注解,这个简单的注解表明该类会作为组件类,并告知spring要为这个类创建bean。

默认id为将类名的第一个字母变为小写。如果不想使用默认id,可以自定义id,如@Component("自定义id名“)。

[email protected]:  组件扫描默认是不启用的。我们需要显示配置一下spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。@ComponentScan注解能够在spring中启用组件扫描。如果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包,即扫描这个包以及下面的所有子包,查找带有@Component注解的类。

为了指定不同的基础包,你所需要做的就是在@ComponentScan的value属性中指明包的名称,如@ComponentScan(”包名“)。如果你想要更加清晰地表名你所设置的是基础包,可以通过basePackages属性进行配置,如@ComponentScan(basePackeges=”包名“),如果你想要设置多个基础包,只需要将basePackages属性设置为要扫描包的一个数组即可,如@ComponentScan(basePackages={"包1”,“包2”,.....})。除了将包设置为简单的string类型之外,该注解还提供了另外一种方法,那就是将其指定为包中所包含的类或接口,如@ComponentScan(basePackageClassess={one.class, two.class}),这些类所在的包将会作为组件扫描的基础包。

[email protected]:  该注解作用与@Component基本相同。

[email protected]:  该注解是用来进行依赖注入的,它会寻找spring容器中适合的bean传递给该方法的参数。@Autowired注解不仅能够用在构造器上,还能用在属性的Setter方法上。实际上该注解可以用在该类的任何方法上.

不管是构造器、Setter方法还是其他的方法,spring都会尝试满足方法参数上所声明的依赖。

如果没有匹配的bean,那么在应用上下文创建的时候,spring会抛出一个异常。为了避免异常的出现,你可以将@Autowired的required属性设置为false。将required属性设置为false时,spring会尝试执行自动装配,但是如果没有匹配的bean的话,spring会让这个bean处于未装配的状态。

如果有多个bean都能满足依赖关系的话,spring将会抛出一个异常,表名没有明确指定要选择哪个bean进行装配。

[email protected]:  该注解作用与@Autowired相同。

[email protected]:  创建JavaConfig类的关键在于为其添加@Configuration注解,该注解表名这个类是一个配置类。

[email protected]:  要在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。如下:

@Bean
public CompactDisc sgtPeppers(){
    return new SgtPeppers();
}

@Bean注解会告诉spring这个方法将会返回一个对象,该对象要注册为spring应用上下文中的bean。

默认情况下,bean的id与带有@Bean注解的方法名是一样的。在上述例子中,这个bean的id为sgtPeppers。你可以通过name属性指定一个不同的名字。@Bean(name=“id名”)。

如果你要借助JavaConfig实现注入该怎么做,通过下面这行代码可以实现注入:

@Bean
public CompactDisc sgtPeppers(){
    return new SgtPeppers();
}

@Bean
public CDPlayer cdPlayer(){
    return new CDPlayer(sgtPeppers());
}

第二个bean需要注入第一个bean,所以在构造方法中调用了第一个方法。

可以看到,通过调用方法来引用bean的方法有点令人困惑。下面是一种更为简单的方法:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
    return new CDPlayer(compactDisc);
}

在这里,cdPlayer()方法请求一个CompactDisc作为参数。通过这种方法引用其他bean通常是最佳的选择,因为它不会要求将COmpactDisc声明到同一个配置之中。

[email protected]:  通过@Import注解将两个类组合在一起。

[email protected]:  使配置在JavaConfig中的bean和配置在XML中的bean都会被加载到spring容器之中。

五.最后

最后想写一点与前面没有关系的东西,不久前在b站看到的了一个视频,题目叫做《不要做程序员》,本着好奇的心态就点就去了,一开始以为就是一个劝退的视频,无非就要说做程序员怎们怎们不好,但是进去后发现我错了,up主在里面说了一个很好的思想,叫:不要做程序员,要做问题解决者。对啊,编程只是解决问题的一种工具,重要的不在于工具,而是思想以及热情,我们不能被工具所累,最后只是成为了一个为了编程而编程的人,而要想一想我们所做的东西能为别人带来什么,尽量让自己的程序有所意义,这就是一点感悟吧,不喜勿喷。

原文地址:https://www.cnblogs.com/machi12/p/12268248.html

时间: 2024-10-20 19:44:34

spring实战第二章小记-装配bean的相关文章

《spring实战》学习笔记-第二章:装配bean

2.1 Spring配置的可选方案 当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制: (1)在XML中进行显式配置. (2)在Java中进行显式配置. (3)隐式的bean发现机制和自动装配. 建议是尽可能地使用自动配置的机制.显式配置越少越好.当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),我推荐使用类型安全并且比XML更加强大的JavaConfig.最后,只有当你想要使用便利的XML命名空间

Spring 实战-第二章-装配Bean

Bean是Spring对象的声明(装配wiring),要使用Spring,必须先装配需要使用的对象,有3种装配的方式 自动化装配Bean 通过Java代码装配 通过XML装配 自动化装配Bean 自动化装配Bean很简单 1.声明接口 package soundsystem; public interface CompactDisc { void play(); } 2.添加注解 package soundsystem; import org.springframework.stereotype

Spring实战之通过XML装配bean

尽管Spring长期以来确实与XML有着关联,但现在需要明确的是,XML不再是配置Spring的唯一可选方案.Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用XML还是很重要的.但是,我希望本节的内容只是用来帮助你维护已有的XML配置,在完成新的Spring工作时,希望你会使用自动化配置和JavaConfig. 1.1创建XML配置规范 在使用XML为Spring装配b

Spring实战笔记2---Bean的装配

创建应用对象之间协作关系的行为通常成为装配,该篇的主要内容有两个,一个Spring装配Bean的几种方式以及Spring表达式,其实这两者是分不开的,在Spring中,对象无需自己负责查找或者创建与其关联的其他对象,相反容器负责把需要相互协作的对象一引用赋予各个对象,目前我们先说声明式的装配,注解式的装配等溜到下篇再详细记录,在声明用的xml配置文件中,可以使用表达式来完成一些简单的逻辑处理,和方法调用或者对象引用,在有些特殊的需求当中非它莫属,首先是装配Bean 声明Bean <bean id

《玩转Spring》第二章 BeanPostProcessor扩展

上一章,介绍了如何扩展spring类实现自动读取配置文件. 这一章,我们介绍如何通过实现BeanPostProcessor接口,对容器中的Bean做一层代理,来满足我们的个性化需求. 一.基本原理 我很不想贴代码,显得太没水平.有时候自己的语言又很空洞,不得不贴代码,感觉用代码来说明一件事反而更容易些. import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.

spring在IoC容器中装配Bean详解

1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean实例放入bean缓存池: 应用程序使用bean. 1.2.基于xml的配置 (1)xml文件概述 xmlns------默认命名空间 xmlns:xsi-------标准命名空间,用于指定自定义命名空间的schema文件 xmlns:xxx="aaaaa"-------自定义命名空间,xx

第2章 装配Bean

目录 第2章 装配Bean 2.1 Spring配置的可选方案 2.2 自动化装配bean 2.2.1 创建可被发现的bean 2.2.2 为组件扫描的bean命名 2.2.3 设置组件扫描的基础包 2.2.4 通过为bean添加注解实现自动装配 2.3 通过Java代码装配bean 2.3.1 创建配置类 2.3.2 声明简单的bean 2.3.3 借助JavaConfig实现注入 2.4 通过XML装配bean 2.4.1 创建XML配置规范 2.4.2 声明一个简单的bean 2.4.3

《The Django Book》实战--第二章--动态网页基础

这章演示了一些最基本的Django开发动态网页的实例,由于版本不一样,我用的是Django 1.,6.3,有些地方按书上的做是不行的,所以又改了一些,写出来让大家参考. 这是一个用python写的一个显示当前时间的网页. 1.开始一个项目. 在命令行中(指定要保存项目代码的盘或文件夹下)输入 python ...\django-admin.py startproject djangobook  (虽然在环境变量Path中加入了django-admin.py的地址,但是在前面还是要加上路径名,不知

.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

原文:.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证 内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序(需要有IdentityServer4),我们首先需要干什么呢?那就是搞一个UI,这样非常美观既可以看到我们的身份验证效果,那么Iden