Spring的注入方式详解


Spring的注入方式详解

Spring有三个注入方式,type1,type2,type3 type1 接口依赖 type2 setter/getter type3 构造方法 type2,type3较用常用 首先来看一下type2
type2 setter/getter(引用注入)
例如,存在一个User类和Home类 user类里一个userName;一个Home对象的属性. public class User { private String userName; private Home myHome; public Home getMyHome() { return myHome; } public void setMyHome(Home myHome) { this.myHome = myHome; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } public class Home { private String homeAddr; public String getHomeAddr() { return homeAddr; } public void setHomeAddr(String homeAddr) { this.homeAddr = homeAddr; } }
public class TestMain {
public static void main(String[] args) {
ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");
User user1=(User)context.getBean("user");
System.out.println(“姓名为: ”+user1.getUserName());
System.out.println(“家庭住址是: ”+user1.getMyHome().getHomeAddr());
}
} 将两个bean的注入:(applicationContext.xml配置如下) <bean id="home" class="test.lyx.Home" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="homeAddr"> <value>大连</value> </property> </bean> <bean id="user" class="test.lyx.User" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="userName"> <value>liuyuanxi</value> </property> <property name="myHome"> <ref bean="home"/> </property> </bean> 这里的user bean,引用了home bean, 运行时会打出  姓名为:liuyuanxi 家庭住址是:大连 这种方式就是setter/getter方式注入,习惯用JavaBean的人应该很容易理解这种方法,也就是能过<property name="userName">来指定属性. <value>liuyuanxi</value>来指定属性所对应的值.多少个属性就有多少个<property> 这里一个人,和家是两个类,也提到了两个bean之间的引用.也就是user bean给名字赋了值,home bean给地址赋了值.如果在user bean中想引入 home bean中的地址.就用<ref/>不再用<values> type3 构造方法注入
这里我们在User里加入一个构造器 public User(Home myHome){ this.myHome=myHome; } 然后 把配置文件改一下:autowire=constructor; <bean id="home" class="test.lyx.Home" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="homeAddr"> <value>大连</value> </property> </bean> <bean id="user" class="test.lyx.User" abstract="false" singleton="true" lazy-init="default" autowire=" constructor " dependency-check="default"> <property name="userName"> <value>liuyuanxi</value> </property> <property name="myHome"> <ref bean="home"/> </property> </bean> 运行时会打出  姓名为:liuyuanxi 家庭住址是:大连 这种方式就是构造器注入 我们再来看看spring的绑定 也就是通过bean属性autowire来设置 1. 通过bean属性autowire="byType"的设置可以使用bean在运行时候根据去寻找同类型的已定义属性,如果找不到则处于未绑定状态.(已定义好指在applicationContext.xml中初始化)这里我们把配置文件的 user bean的autowire改成autowire="byType",注意一定要把User的构造器去掉,要不然先找构造器,会出错.这里的home bean是属于,test.lyx.Home类型的,而user bean里有两个属性一个属性已经初始化,而另一个属性Home,就会自动找到. applicationContext.xml配置如下: <bean id="home" class="test.lyx.Home" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="homeAddr"> <value>大连</value> </property> </bean> <bean id="user" class="test.lyx.User" abstract="false" singleton="true" lazy-init="default" autowire=" byType " dependency-check="default"> <property name="userName"> <value>liuyuanxi</value> </property> <property name="myHome"> <ref bean="home"/> </property> </bean> 运行时会打出  姓名为:liuyuanxi 家庭住址是:大连 这种方式就是构造器注入 但这样的寻找方式有一个弱点, 假如再注入一个Home bean,叫home1,运行时就会找到两个bean,出错. <bean id="home1" class="test.lyx.Home" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="homeAddr"> <value>beijing</value> </property> </bean> 如果我们想解决这种问题也很简单,我们可以把autowire改为,autowire="byName"方式来寻找. 但是这里一定要注意:Home bean的id名,一定要和属性名字一样.这里应该改成,id="myHome" <bean id="home1" class="test.lyx.Home" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="homeAddr"> <value>dalian</value> </property> </bean> <bean id="myHome" class="test.lyx.Home" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="homeAddr"> <value>北京</value> </property> </bean> 这样的话 运行时会打出  姓名为:liuyuanxi 家庭住址是:北京 而不在是大连了,这种寻找方式就是byName,也就是按属性的名字进行查询.注意:id一定要属性的名字一样. 2.我们来比较一个byname bytype这两种方式. byname要比bytype精确些,因为id,是不能重名的. 而且假如存在一这样一种情况,两个user bean,分别为user1,user2,那么user1,user2都可以,打出北京.重用性很好. 到这可能有人会想到.user1,和user2调用的是同一个Home吗.你可以把他们的hashcode();打出来,你会发现地址是一样的,也就是说,是同一个bean.这里是因为singleton="true"的原因,如果你把singleton改成了"false"那就不是一个对象了. 3.如果把autowire=” constructor”也就是构造器注入一定要注意了,他是以byType进行查找,也就是说,Home bean,是不能出现两次,否则就会出错了. 4.如果autowire设置成为autodetect,他会一直找,直到找到一个合适的为止.constructor,bytype,byname的顺序去找.这种方式是不推荐使用的.因为你很难判断出执行的是那个. 优质内容筛选与推荐>>
1、chosen组件实现下拉框
2、linux NFS服务部署
3、MACHINE_START-内核板级初始化实现机制(linux3.1.0)
4、c#图像处理入门的一个好方法-bitmap类和图像像素值获取方法
5、PE/ELF文件里面存的是什么呢?


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn