博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bean自动装配-XML最小化配置
阅读量:5226 次
发布时间:2019-06-14

本文共 6230 字,大约阅读时间需要 20 分钟。

上一个讲了怎样用xml配置所有的Bean以及进行依赖注入,但是这样太麻烦了,对于每一个bean都要写一个xml,可以有几种方式进行自动装配。

  •   四种装配方式
    •   byName(通过名字装配,这时属性的名字必须与bean名字一致)
    •       byType(通过类型,匹配与interface或class相同的类型),这种是找到对应的方法,然后进行setter方法进行注入的
    •       constructor(也是通过类型匹配,但是是通过new的进行装配的)
    •       最佳自动装配(先用constructor装配,然后再用byType)

       但是自动装配有两个问题。要是有多个bean,就用这个。

     primary="false"   和    autowire-candicate='false'

public interface Food {    public String foodName();}public class BeefFood implements Food {    private String name;    public BeefFood() {    }    public BeefFood(String name) {        this.name = name;    }    public String foodName(){        return name;    }    public void setName(String name) {        this.name = name;    }}public interface Dinner {    public void foodList();}public class BigDinner implements Dinner{    private Food food;    private String position;    public BigDinner() {    }    public BigDinner(Food food) {        this.food = food;    }    public BigDinner(String position, Food food) {        this.position = position;        this.food = food;    }    public void setPosition(String position) {        this.position = position;    }    public void setFood(Food food) {        this.food = food;    }    public void foodList(){        System.out.println("今晚在" + position + "吃" + food.foodName());    }}

插入xml配置

其实只是少了一些<constractor-arg>和<property>配置

测试类为

public class TestBeanAutowire {    public static void main(String[] args) {        //传统依赖注入方式        Food beef = new BeefFood("黄牛肉");        System.out.println("传统依赖注入方式" + " =========>>>>>>>  yellowBeef " + "Test");        Dinner dinner = new BigDinner("家里",beef);        dinner.foodList();        //context        ApplicationContext context = new ClassPathXmlApplicationContext("spring-bean-autowire.xml");        //传统xml DI方式        Dinner dinnerTranditional = (Dinner) context.getBean("dinnerTranditional");        System.out.println("传统xml DI方式" + " =========>>>>>>>  yellowBeef " + "Test");        dinnerTranditional.foodList();        //autowire byName方式        Dinner dinnerByName = (Dinner) context.getBean("dinnerByName");        System.out.println("autowire byName方式" + " =========>>>>>>>  干煸大肠 " + "Test");        dinnerByName.foodList();        //autowire byType方式        Dinner dinnerByType = (Dinner) context.getBean("dinnerByType");        System.out.println("autowire byType方式" + " =========>>>>>>>  yellowBeef " + "Test");        dinnerByType.foodList();        //autowire constructor方式        Dinner dinnerConstructor = (Dinner) context.getBean("dinnerConstructor");        System.out.println("autowire constructor方式" + " =========>>>>>>>  yellowBeef " + "Test");        dinnerConstructor.foodList();//        //autowire autoDetect方式//        Dinner dinnerAutoDetect = (Dinner) context.getBean("dinnerAutoDetect");//        System.out.println("autowire autoDetect方式" + " =========>>>>>>>  yellowBeef " + "Test");//        dinnerAutoDetect.foodList();    }}
传统依赖注入方式 =========>>>>>>>  yellowBeef Test今晚在家里吃黄牛肉十一月 29, 2015 10:47:29 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6f6827b5: startup date [Sun Nov 29 22:47:29 CST 2015]; root of context hierarchy十一月 29, 2015 10:47:29 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [spring-bean-autowire.xml]传统xml DI方式 =========>>>>>>>  yellowBeef Test今晚在我和亲共同的家里吃黄牛肉autowire byName方式 =========>>>>>>>  干煸大肠 Test今晚在我和亲共同的家里吃干煸大肠autowire byType方式 =========>>>>>>>  yellowBeef Test今晚在我和亲共同的家里吃黄牛肉autowire constructor方式 =========>>>>>>>  yellowBeef Test今晚在我和亲共同的家里吃黄牛肉Process finished with exit code 0

这个是测试结果。

                  

  •   然后这种不用注解的方式也必须要声明好多bean,只是之间的关系可以进行少一点,说白了就是少了点<constractor-arg>和<property>

          所以这种基于注解的方式就比较方便了。

      这样也存在问题,一是没有bean,解决方式@Autowired(required=false)

              二是有好几个bean,用这个@Qualifier("name"),这个名字小写就行,也可以自己定义一个限定器,见代码。

    •    还有一个问题是扫描组件,@Component这样就自动扫描。
public interface Food {    public String foodName();}@Component@DefineRibpublic class RibFood implements Food{    private String name = "排骨";    public String foodName(){        return name;    }    public void setName(String name) {        this.name = name;    }}@Componentpublic class BeefFood implements Food {    private String name = "黄牛肉";    public String foodName(){        return name;    }    public void setName(String name) {        this.name = name;    }}public interface Dinner {    public void foodList();}@Componentpublic class BigDinner implements Dinner {    @Autowired//    @Qualifier("beefFood")//按class的小写名字    @DefineRib//按限定器来注解    private Food food ;    @Value("和亲的小屋里")    private String position;//    @Autowired//    public BigDinner(Food food, String position) {//        this.food = food;//        this.position = "和亲的家里";//    }    public void setPosition(String position) {        this.position = position;    }    public void setFood(Food food) {        this.food = food;    }    public void foodList(){        System.out.println("今晚在" + position + "吃" + food.foodName());    }}@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.PARAMETER,ElementType.FIELD})@Qualifierpublic @interface DefineRib{}
public class TestBeanAnnotation {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("spring-bean-annotation.xml");        Dinner dinner = (Dinner)context.getBean("dinnerAuto");        dinner.foodList();    }}

这样xml就很小了

      

转载于:https://www.cnblogs.com/damiao-hungry/p/5005876.html

你可能感兴趣的文章
B2321 [BeiJing2011集训]星器 数学&&物理
查看>>
201571030319 四则运算
查看>>
RestTemplate 调用本地服务 connection refused
查看>>
.NET方向高级开发人员面试时应该事先考虑的问题
查看>>
台达PLC modbus 不支持04功能码
查看>>
发布一个JavaScript工具类库jutil,欢迎使用,欢迎补充,欢迎挑错!
查看>>
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
makefile中使用变量
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
JavaScript 鸭子模型
查看>>
SQL Server 如何查询表定义的列和索引信息
查看>>
GCD 之线程死锁
查看>>
NoSQL数据库常见分类
查看>>
一题多解 之 Bat
查看>>
Java 内部类
查看>>