SpringIOC应用之纯XML模式

    科技2025-03-29  11

    Web环境下启动IOC容器

    <!--web.xml--> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置Spring ioc容器的配置文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--使用监听器启动Spring的IOC容器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> <!--applicationContext.xml--> <?xml version="1.0" encoding="UTF-8"?> <!--跟标签beans,里面配置一个又一个的bean子标签,每一个bean子标签都代表一个类的配置--> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="transactionManager" class="com.tong.utils.TransactionManager"> <property name="ConnectionUtils" ref="connectionUtils"/> </bean> </beans>

    实例化Bean的三种⽅式

    方式一:使⽤⽆参构造函数在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象。如果类中没有⽆参构造函数,将创建失败。<!--Bean标签属性--> <!--id属性:⽤于给bean提供⼀个唯⼀标识。在⼀个标签内部,标识必须唯⼀--> <!--class属性:⽤于指定创建Bean对象的全限定类名--> <!--name属性:⽤于给bean提供⼀个或多个名称。多个名称⽤空格分隔--> <!--factory-bean属性:⽤于指定创建当前bean对象的⼯⼚bean的唯⼀标识,当指定了此属性之后,class属性失效--> <!--factory-method属性:⽤于指定创建当前bean对象的⼯⼚⽅法,如配合factory-bean属性使⽤,则class属性失效。 如配合class属性使⽤,则⽅法必须是static的--> <!--scope属性:⽤于指定bean对象的作⽤范围。通常情况下就是singleton--> <!--init-method属性:⽤于指定bean对象的初始化⽅法,此⽅法会在bean对象装配后调⽤。必须是⼀个⽆参⽅法--> <!--destory-method属性:⽤于指定bean对象的销毁⽅法,此⽅法会在bean对象销毁前执⾏。它只能为scope是singleton时起作⽤--> <!--配置service对象--> <bean id="userService" class="com.tong.service.impl.TransferServiceImpl"></bean> 方式二:使⽤静态⽅法创建,在实际开发中,我们使⽤的对象有些时候并不是直接通过构造函数就可以创建出来的,它可能在创建的过程中会做很多额外的操作。此时会提供⼀个创建对象的⽅法,恰好这个⽅法是static修饰的⽅法,即是此种情况。<!--example Function--> public static ConnectionUtils getInstanceStatic(){return new ConnectionUtils();} <!--使⽤静态⽅法创建对象的配置⽅式--> <bean id="connectionUtils" class="com.tong.factory.BeanFactory" factory-method="getInstanceStatic"> </bean> 方式三:使⽤实例化⽅法创建此种⽅式和上⾯静态⽅法创建其实类似,区别是⽤于获取对象的⽅法不再是static修饰的了,⽽是类中的⼀个普通⽅法。此种⽅式⽐静态⽅法创建的使⽤⼏率要⾼⼀些。在早期开发的项⽬中,⼯⼚类中的⽅法有可能是静态的,也有可能是⾮静态⽅法,当是⾮静态⽅法时,即可采⽤下⾯的配置⽅式。<!--example Function--> public ConnectionUtils getInstance(){ return new ConnectionUtils(); } <!--使⽤实例⽅法创建对象的配置⽅式--> <!--首先实例化createBeanFactory,相当于new了一个对象--> <bean id="createBeanFactory" class="com.tong.factory.instancemethod.CreateBeanFactory"></bean> <!--factory-bean相当于引用了另外一个Bean--> <bean id="connectionUtils" factory-bean="createBeanFactory" factory-method="getInstance"></bean>

    Bean的作用范围及⽣命周期

    作⽤范围的改变 在spring框架管理Bean对象的创建时,Bean对象默认都是单例的,但是它⽀持配置的⽅式改变作⽤范围。作⽤范围官⽅提供的说明如下图: 我们实际开发中⽤到最多的作⽤范围就是singleton(单例模式)和prototype(原型模式,也叫多例模式)<!--单例模式:singleton IOC容器中只有一个该类对象。 对象出⽣:当创建容器时,对象就被创建了。 对象活着:只要容器在,对象⼀直活着。 对象死亡:当销毁容器时,对象就被销毁了。 ⼀句话总结:单例模式的bean对象⽣命周期与容器相同。--> <!--多例模式:prototype 每次使用该类的对象(getBean),都返回一个新的对象。 对象出⽣:当使⽤对象时,创建新的对象实例。 对象活着:只要对象在使⽤中,就⼀直活着。 对象死亡:当对象⻓时间不⽤时,被java的垃圾回收器回收了。 ⼀句话总结:多例模式的bean对象,spring框架只负责创建,不负责销毁。--> <!--配置service对象--> <bean id="transferService" class="com.tong.service.impl.TransferServiceImpl" scope="singleton"></bean>

    DI 依赖注⼊的xml配置

    按照注⼊的⽅式分为: 构造函数注⼊:顾名思义,就是利⽤带参构造函数实现对类成员的数据赋值。它的使⽤要求是,类中提供的构造函数参数个数必须和配置的参数个数⼀致,且数据类型匹配。同时需要注意的是,当没有⽆参构造时,则必须提供构造函数参数的注⼊,否则Spring框架会报错。public class JdbcAccountDaoImpl implements AccountDao { private ConnectionUtils connectionUtils; private String name; private int sex; private float money; public JdbcAccountDaoImpl(ConnectionUtils connectionUtils, String name, int sex, float money) { this.connectionUtils = connectionUtils; this.name = name; this.sex = sex; this.money = money; } } <bean id="accountDao" class="com.lagou.edu.dao.impl.JdbcAccountDaoImpl"> <!--index按照参数索引位置注入--> <!--在使⽤构造函数注⼊时,涉及的标签是 constructor-arg ,该标签有如下属性: name:⽤于给构造函数中指定名称的参数赋值。 index:⽤于给构造函数中指定索引位置的参数赋值。 value:⽤于指定基本类型或者String类型的数据。 ref:⽤于指定其他Bean类型的数据。写的是其他bean的唯⼀标识。--> <!--<constructor-arg index="0" ref="connectionUtils"/> <constructor-arg index="1" value="zhangsan"/> <constructor-arg index="2" value="1"/> <constructor-arg index="3" value="100.5"/>--> <!--name:按照参数名称注入--> <constructor-arg name="connectionUtils" ref="connectionUtils"/> <constructor-arg name="name" value="zhangsan"/> <constructor-arg name="sex" value="1"/> <constructor-arg name="money" value="100.6"/> </bean> set⽅法注⼊:它是通过类成员的set⽅法实现数据的注⼊。(使⽤最多的) 按照注⼊的数据类型分类:基本类型和String,其他Bean类型,复杂类型(Array,List,Set,Map,Properties)public class JdbcAccountDaoImpl implements AccountDao { private ConnectionUtils connectionUtils; private String name; private int sex; private float money; public void setConnectionUtils(ConnectionUtils connectionUtils) { this.connectionUtils = connectionUtils; } public void setName(String name) { this.name = name; } public void setSex(int sex) { this.sex = sex; } public void setMoney(float money) { this.money = money; } //复杂数据类型注⼊ private String[] myArray; private Map<String, String> myMap; private Set<String> mySet; private Properties myProperties; public void setMyArray(String[] myArray) { this.myArray = myArray; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setMyProperties(Properties myProperties) { this.myProperties = myProperties; } } <bean id="accountDao" class="com.lagou.edu.dao.impl.JdbcAccountDaoImpl"> <!--set注入使用property标签,如果注入的是另外一个bean那么使用ref属性,如果注入的是普通值那么使用的是value属性--> <!--在使⽤set⽅法注⼊时,需要使⽤ property 标签,该标签属性如下: name:指定注⼊时调⽤的set⽅法名称。(注:不包含set这三个字⺟,druid连接池指定属性名称) value:指定注⼊的数据。它⽀持基本类型和String类型。 ref:指定注⼊的数据。它⽀持其他bean类型。写的是其他bean的唯⼀标识。--> <property name="ConnectionUtils" ref="connectionUtils"/> <property name="name" value="zhangsan"/> <property name="sex" value="1"/> <property name="money" value="100.3"/> <!--set注入注入复杂数据类型--> <property name="myArray"> <array> <value>array1</value> <value>array2</value> <value>array3</value> </array> </property> <property name="myMap"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> </map> </property> <property name="mySet"> <set> <value>set1</value> <value>set2</value> </set> </property> <property name="myProperties"> <props> <prop key="prop1">value1</prop> <prop key="prop2">value2</prop> </props> </property> </bean>
    Processed: 0.010, SQL: 8