11

2018/12/03

#11/n# 装配Bean

隐式的bean发现机制和自动装配

@Component 简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean
 可以指定bean名,如@Component("guohao")  也可以不写名字 默认为首字母小写的类名
==@Named

组件扫描

放在配置文件上

java类

@ComponentScan  放在 @Configuration Spring将会扫描这个包以及这个包下的所有子包,查找带有@Component注解的类
也可以扫描指定包名@ComponentScan(" ") 或者 @ComponentScan(basePackages=" guohao")
又或者要扫描多个包,只需要将basePackages属性设置为要扫描包的一个数组即可:@ComponentScan(basePackages={" guohao",“wenwenwen”})
又或者 指定所包含的接口和类:@ComponentScan(basePackageClasses={guohao.class,wenwenwen.class})

XML

<context:component-scan  base-packge=" "> 填包名 
Assert.notNull(Object object) 断言某个值 不为空 如果不一样就抛出异常

自动装配

@Autowired可以用在构造器上,还可以用在属性的Setter方法上
@Autowired(required=false)

>  将required属性设置为false时,Spring会尝试执行自动装配,但
> 是如果没有匹配的bean的话,Spring将会让这个bean处于未装配的状
> 态。但是,把required属性设置为false时,你需要谨慎对待。如 果在你的代码中没有进行null检查的话,这个处于未装配状态的属性
> 有可能会出现NullPointerException。 ==@Inject

通过java代码装配Bean

创建配置类

@Configuration @Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节

@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 也可以设置 @Bean(“guohao”)

实现注入

调用方法注入

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

sgtPeppers()方法上添加了@Bean注解, Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的 bean,而不是每次都对其进行实际的调用

使用接口 DI方法

 @Bean
public CDPlayer cdPlayer( CompactDisc compactDisc){
       return new  CDPlayer( compactDisc);
    } **CompactDisc 是接口** 

在这里,cdPlayer()方法请求一个CompactDisc作为参数。当 Spring调用cdPlayer()创建CDPlayerbean的时候,它会自动装配 一个CompactDisc到配置方法之中。然后,方法体就可以按照合适 的方式来使用它。借助这种技术,cdPlayer()方法也能够 将CompactDisc注入到CDPlayer的构造器中,而且不用明确引 用CompactDisc的@Bean方法。 通过这种方式引用其他的bean通常是最佳的选择,因为它不会要求 将CompactDisc声明到同一个配置类之中。在这里甚至没有要 求CompactDisc必须要在JavaConfig中声明,实际上它可以通过组件 扫描功能自动发现或者通过XML来进行配置。你可以将配置分散到多 个配置类、XML文件以及自动扫描和装配bean之中,只要功能完整健 全即可。不管CompactDisc是采用什么方式创建出来的,Spring都 会将其传入到配置方法中,并用来创建CDPlayer bean。

Set方法注入

上述是构造器注入 也可以是Set方法注入 ![set方法][1]

通过XML装配bean

java类只需要一个@Configuration 而 使用XML时,需要在配置文件的顶部声明多个XML模式(XSD)文件 声明 Bean

bean的ID将会 是“soundsystem.SgtPeppers#0”。其中,“#0”是一个计数的形 式,用来区分相同类型的其他bean。如果你声明了另外一 个SgtPeppers,并且没有明确进行标识,那么它自动得到的ID将会 是“soundsystem.SgtPeppers#1”

指定id
<bean class-=”com.guohao.helloworld” id=”guohao”/ >

构造器注入初始化bean

元素

<bean id=""  class=" "   >
     <constructor-arg    ref ="" />
</bean>

装配字面量: 构造函数有几个参数就写几个下面这句话

装配集合 列表为字面量

<constructor-arg  
        <list
                  <value>  ....</value>
                  <value>  ....</value>
                   <value>  ....</value>
          />
 /> 

在装配集合方面,比c-命名空间的属性更有优 势

列表为bean

<constructor-arg  
            <list
                      <ref   bean="">
                      <ref   bean="">
                      <ref   bean="">
              />
     /> 

c名称空间

文件头部加一个 xmls:c=” …………………”

<bean id=""  class=" "    c:cd-ref= " 要注入的beanid" />
</bean>

装配字面量: 构造函数有几个参数就写几个下面这句话

  c:_0-ref= " 要注入的beanid"
  c:_1-ref= " 要注入的beanid" 

cd为构造器参数名

装配集合

属性注入

元素为属性的Setter方法所提供的功能 与元素为构造器所提供的功能是一样的 <property name="" ref=" " / > <property name="" value=" " / > <property name="" <list ..</value> .. </value> ... </value> /> / > </bean> p名称空间: <bean id="cdplayer" class=" " p:cd-ref="cdplayer" cd为 set方法参数的变量名 </bean> <bean id="cdplayer" class=" " p:title="guohao" title 为set方法参数的变量名 p:artist="wenwen" </bean> ### util命名空间 Spring util-命名空间中的一些功能来简化BlankDiscbean ## 导入和混合设置 ### 在javaconfig中应用xml配置 @Import(cdConfig.class) 一个配置类 和另一个配置类相互组合 这个注解是组合java配置类 配置类的整合 最好方式是 : 一个最大的配置类 头顶@import({config.class.config2.class}) 当在xml中装配bean时 , java类中最大的config头顶应该有 @ImportResource("classpath:cd-config.xml") ### 在xml中 引用javaconfig [1]: http://139.199.206.151:1998/upload/2018/12/vlf24aq3peha9ptslpuujma63t.bmp

╰(*°▽°*)╯ (dadaguo-dadaguo

Post Directory