spring实战学习(三)配置方式

spring配置方式有xml配置和注解配置和基于java的配置方式,配置Bean是spring应用的重要一环,依赖注入也是spring实现ioc的核心。

xml配置方式

常见的几种注入方式
1.setter方法注入
2.构造器方法注入
3.p命名空间注入

setter方法注入
在spring中一般使用元素来调用属性的setter方法注入

<bean id="tom" class="test.worker">
     <property name="hobby" value="sing"/>   //将sing注入hobby属性通过set方法
</bean>               

构造器方法注入

<bean id="jerry" class="test.worker">
     <constructor-arg name="hobby" value="run"/>  //将run注入hobby属性通过构造方法
</bean>

p命令空间注入
p命令空间其实相对前面两种一种更简写的注入方法

<bean id="tom" class="test.worker"
     p:hobby="sing"/>
<bean id="jerry" class="test.worker"
     p:hobby="run"/>

这些都是比较基础的类型装配,在java中有很多集合类,spring同样提供了它们的装配方式
装配List

<bean id="tom" class="test.worker">
     <property name="hobby">
        <list>
              <value>sing</value>
              <value>run</value>
              <value>basketball</value>
              <ref  bean="xxx"/>     //引用装配方式
        </list>
     </property>
</bean> 

装配Set

<bean id="jerrry" class="test.worker">
     <property name="hobby">
        <set>
              <value>sing</value>
              <value>run</value>
              <value>basketball</value>
              <ref  bean="xxx"/>     //引用装配方式
        </set>
     </property>
</bean> 

装配Map

<bean id="tom" class="test.worker">
     <property name="hobby">
        <map>
             <entry key="hobby1" value="sing"/>
             <entry key="hobby2" value="run"/>
             <entry key="hobby3" value="basketball"/>
        </map>
     </property>
</bean> 

tip:元素由一个键和一个值组成他们都可以为值或者引用
key:指定键为string
key-ref:指定键为引用
value:指定值为string
value-ref:指定值为引用

另外spring可以装配空值使用<null/>元素

自动装配和自动检测

上面的xml配置虽然能完成Bean装配,但是当Bean元素的数量不断增多时,xml文件必然变得复杂,所有spring提供了几种减少xml配置的方法

spring提供了五种类型的自动装配
1.byName:把与Bean属性具有相同名字或者id的Bean注入到Bean属性中去。

<bean id="hobby" class="test.hobbies"/>

<bean id="tom" class="test.worker"  autowire="byName">
      <property  id="age",value="22"/>//因为tom的hobby属性和Bean的id一样,所以会将Bean直接注入这个属性
</bean>                      

2 byType:把与Bean的属性具有相同类型的自动装配到Bean的属性中
使用方式和上面一样,不过byType自动装配有一个局限,当多个Bean的类型与要装配的类型一样时,spring不会选择最优Bean,而是抛出异常

我们有两种方法可以解决这个问题,一,我们可以自己标记出首选Bean,使用Bean元素的primary属性设置为true即可,但是默认所有的Bean这个属性都是true,所以我们需要将其他Bean都设置为false才能达到效果。二,我们可以排除一些Bean,设置autowire-candidate属性为false即可。

3.constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器对应的入参中
constructor和byTpye具有一样的局限性,多个Bean匹配入参或者一个类的多个构造器都满足匹配条件,spring不会做出最优解,而是抛出异常

4 autodetect 它是首先尝试constructor进行自动装配,失败再尝试byTpye的一种方法。

5.no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean

注解配置方式

注解配置方式和在xml文件中使用自动装配效果上是一样的,但是它省去了繁琐的xml文件,允许我们在java类上直接进行配置注入

首先需要声明我们使用了注解配置方法
在xml文件中加入context:component-scan 元素

<context:component-scan base-package="test" />//告诉spring我们启用注解配置,并在base-package中的包下进行自动扫描

@Component:用来标识bean和xml中的作用一样,相当于定义bean,它没有显示的id,默认在spring中的id是类名首字母小写
@controller 控制器(注入服务)用于标注控制层,相当于struts中的action层
@service 服务(注入dao)用于标注服务层,主要用来进行业务的逻辑处理
@repository(实现dao访问)用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
这四个注解用法是一样的,只是这样标注更容易区分它们分别作用在哪个层

表明依赖关系的注解
@Autowired(Spring提供的)//相当于xml文件提到的自动检测注入,但是前面有四种自动注入方式,这里默认采用byType的方式注入,如果type相当则byName
@Qualifier:这里面可以给定一个名字,当byName的时候用来选择注入
它有一个属性required,表示当前bean是否必须被注入

@Resource:和@Autowired几乎一样,但不能配合@Qualifier,因为它本身就可以指定beanName。但没有required属性

基于java的配置方式

注解开发虽然省去了复杂冗余的bean等等,但是我们还是要使用xml文件开启注解才行,也就是xml文件并不能完全被取代。

所以另一种方式可以进行改进比如开启注解的context:component-scan元素可以被@ComponentScan替代,这样xml就完全省去了,但是这其中还有个问题,就是ClassPathXmlApplicationContext这个类要求我们必须传一个XML,这时@Configuration就起到作用了,被它修饰的java类等同于xml文件,习惯称为配置类。在使用配置类以后,我们使用AnnotationConfigApplicationContext容器与之对应,这个容器就是针对注解开发的。

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);//传入类的.class文件
        Worker worker = (Worker) applicationContext.getBean("worker ");
        System.out.println(worker);
    }
}

@Bean 在这种配置方式中起到定义和注入Bean的作用

最后这三种方式互不影响,可以同时使用,但一般不这样做,只是两两混合用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值