spring创建bean及数据注入
通过spring的IoC可以实现由配置文件来创建类的对象,可以降低类鱼类之间的耦合,
通常我们都是在代码中控制对象的生成和属性注入,而使用IoC后,就可以将设计好的类交给IoC容器,让容器去控制对象的生成和属性的注入,称为控制反转。生成对象的过程就是将对象依赖的属性进行注入的过程,因此也称依赖注入。
1.实例化bean:通过无参构造;工厂静态方法;工厂非静态方法等
2.属性注入:set方法注入;构造器(构造方法)注入
各类属性的注入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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- lazy-init="true" : true:需要用的时候才实例化bean,默认加载配置文件时候实例化bean --> <!-- init-method="init" 初始化bean,调用init方法 --> <!-- destroy-method="destroy" 销毁bean调用destroy方法 --> <!-- scope="prototype" prototype:创建对象不是单例模式,默认singleton: 单例 --> <bean id="user" class="ni.jun.yang.bean.User" lazy-init="true" init-method="init" destroy-method="destroy" scope="prototype"> <!--构造赋值 --> <constructor-arg name="card" ref="payCard"/> <constructor-arg name="name" type="java.lang.String" value="zhangsan"/> <constructor-arg name="age" type="int" value="123"/> </bean> <bean id="user1" class="ni.jun.yang.bean.User" lazy-init="true" scope="prototype"> <!-- list集合注入值 --> <property name="cards"> <list> <ref bean="payCard"/> <ref bean="payCard1"/> <ref bean="payCard2"/> </list> </property> <!-- set集合注入值 --> <property name="setCards"> <set> <ref bean="payCard"/> <ref bean="payCard1"/> <ref bean="payCard2"/> </set> </property> <!-- map集合注入值 --> <property name="mapCards"> <map> <entry key="1" value-ref="payCard" ></entry> <entry key="2" value-ref="payCard1"></entry> <entry key="3" value-ref="payCard2"></entry> </map> </property> <!--Properties集合注入值 --> <property name="proCards"> <props> <prop key="1">中国银行</prop> <prop key="2">农业银行</prop> <prop key="3">建设银行</prop> </props> </property> </bean> <!--set方法赋值 --> <bean id="payCard" class="ni.jun.yang.bean.PayCard"> <property name="id" value="98746546764"></property> <property name="bankName" value="中国银行"></property> </bean> <bean id="payCard1" class="ni.jun.yang.bean.PayCard"> <property name="id" value="12365478932544"></property> <property name="bankName" value="农业银行"></property> </bean> <bean id="payCard2" class="ni.jun.yang.bean.PayCard"> <property name="id" value="45678975456751"></property> <property name="bankName" value="建设银行"></property> </bean> </beans>
对象的获取:
ApplicationContext ctxt = new ClassPathXmlApplicationContext("user-bean.xml");//配置文件名字 User user = (User) ctxt.getBean("user"); //bean标签的id值
3.自动装配:autowire=byName(通过属性名字) autowire="byType" (通过类型) autowire="constructor"(通过构造器)
感觉不是很好用:
byName主要是根据set方法来进行自动注入值的,相对靠谱
byType 如果有多个值,就会出异常,它不知道到底该用哪个值去装配
constructor :与 byType 非常相似
感觉用自动装配,代码的可读性,不如手动装配注入,而且byType 这种方式容易出异常