Spring框架学习记录二:装配Bean

在Spring中装配bean有多种方式常见的如下

Spring配置的可选方案

  1. 在xml中进行显性配置
  2. 在java中进行显性配置
  3. 隐式的bean发现机制和自动配置

自动化装配Bean

spring从两个角度实现自动化配置
组件扫描(compent scanning):spring会自动发现上下文中所创建的bean;
自动装配(autowiring):spring自动满足bean之间的依赖

创建自动装配实例

还是利用上次用到的警察叔叔police类和扶老奶奶类Fulaonainai,但是写法略有不同,在类的前面我们加上了 @component注解,component的意思是组件,显而易见spring会自动识别它并创建一个bean。

package cn.learningspring;
import org.springframework.stereotype.Component;
@Component("police")     //Component注解实现自动装配
public class Police {
    private Work work;
    @Autowiring
    public Police(Work work){   //work被注入进来
        this.work=work;
    }
    public void Dowork(){
        work.start();
    }
}
package cn.learningspring;
import org.springframework.stereotype.Component;
@Component
public class FuLaonainai implements Work{
    private int age=80;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void start() {
        System.out.println("警察叔叔扶"+age+"岁的老奶奶过马路!");
    }
}
**因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了。*

这次我们把xml配置文件里面的手动注解全部删掉。然后通过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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="cn.learningspring"/> <!-- 启用组件扫描-->
</beans>

但是上面的代码中注解的时候在括号里给组件扫描的bean赋予了一个名字,当然特完全可以不给名字。只写一个@component注解,spring会默认把这个类的首字母变为小写当做这个bean的名字。当然也可以用@named注解来装备,两者功能大体类似,但一般都用@component。

通过添加注解实现自动装配

简单来说自动装配就是让spring自动满足bean依赖的一种方法,其注解为@Autowired,也是见词知意翻译成中文也就是自动装配的意思。具体用法同上只需要早需要依赖的地方添上注解即可。如polic在其构造器需要依赖,只需添加注解,spring就会在创建police bean的时候自动给其一个workbean。

 @Autowiring //自动装配
    public Police(Work work){   //work被注入进来
        this.work=work;
    }

@Autowiring注解不仅能用在构造器上,还能用在setter方法上。且@Inject也和它有相似的作用。

然后运行测试类,仍能正常运行,表明装配正常。

import cn.learningspring.Police;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class PoliceTest {
    public static void main(String args[]){  //加载spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
        Police police=context.getBean(Police.class);   //获取policebean
        police.Dowork();                      //执行work方法
    }
}

通过Java代码装配bean

在需要将某些第三方库装配到项目的时候,自动装配就不行了。必须要采用显示装配。Java和xml。首先是Java配置

创建配置类

package cn.learningspring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PoliceConfig {
    @Bean
    public Work fulaonainai(){
        return new FuLaonainai();
    }
    @Bean
    public Police police(){
        return new Police(fulaonainai());
    }
}

首先创建配置类,这里类名可以自取,声明bean的时候只需要在类中编写方法,然后给这个方法添加@Bean注解,默认情况下bean的名字是和方法的名字一样的,如果想不通,可以在注解后面括号里加name实现:

@Bean(name="fulaonainai")

借助javaconfig实现注入

 @Bean
    public Police police(){
        return new Police(fulaonainai());
    }

这里利用了police的构造器实现了注入。

设置组件扫描的基本包

在没有给@componentScan设置任何属性的时候,他会默认在配置类所在的包扫描,如果想扫描其他包,可通过配置来实现。
1:在其中指定包名,可包含多个包。

@Configuration
@componentScan("backPackage="A","B");
public class PoliceConfig {}

除了将包设置为简单的spring之外,@componentScan还提供了另外一种方法就是将其指定为宝中所包含的类或接口。

xml装配再回顾

在第一次学习记录的时候,我们学习了简单的xml配置,现在进行进一步扩展。在xml中实现注入时,具体到构造器注入有两种基本的配置方案可供选择:

1:元素
2:使用Spring3.0所引入的c-命名空间

在前面的配置中我们可以看到我们首先已经有了一个fulaonainai的bean然后在police里面通过声明id来引用它:

<bean id="police" class="cn.learningspring.Police">
  <constructor-arg ref="fulaonainai"/> //通过id引用
</bean>
<bean id="fulaonainai" class="cn.learningspring.FuLaonainai">
  <property name="age" value="80"></property></bean>

作为替代方案也可以用c命名空进替代,是指更为简洁易懂,要使用它的话必须在头部声明其模式:

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

在声明完成之后,我们可以这样写:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xmls="http://www.springframework.org/schema/c"
       xmlns:c="http://www.springframework.org/schema/c"
       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-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="police" class="cn.learningspring.Police"
c:work-ref="fulaonainai"/>
<bean id="fulaonainai" class="cn.learningspring.FuLaonainai"
c:age="80"
/>
</beans>

在这里我们使用了c-命名空间来声明构造器参数,属性名以"c:"开头,接下来是要装配的构造器的参数名,在此之后是-ref,它会告诉spring正在装配的是一个bean的引用,以及这个bean的名字
在这里插入图片描述
当然也可以使用索引给标识参数,此时只有一个构造器参数,其标志为0:

<bean id="police" class="cn.learningspring.Police"
c:_0-ref="fulaonainai"/>

因为这里只有一个构造器参数,所以还有另外一种方案那就是不写标志参数:

<bean id="police" class="cn.learningspring.Police"
c:_-ref="fulaonainai"/>

再接着看,当我们给老奶奶的年龄赋值的时候是这样写的:

<bean id="fulaonainai" class="cn.learningspring.FuLaonainai">
  <property name="age" value="80"></property></bean>

如果用c-命名空间的话该怎样写呢?第一种方法是引用构造器参数的名字:

<bean id="fulaonainai" class="cn.learningspring.FuLaonainai"
c:age="80"
/>

装配字面量与装配引用的区别在于去掉了ref后缀,与之类似也可以用参数索引的方式进行赋值:

<bean id="fulaonainai" class="cn.learningspring.FuLaonainai"
c:_0="80"
/>

装配集合

###这里就不深入往下写了,赶紧进行下一章的学习,因为不太确定学那么深用不用得到,以后用得到的时候再来回头学习并记录吧##
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值