标签:
1 <!-- 配置一个 bean --> 2 <bean id="helloWorld" class="com.atguigu.spring.helloworld.HelloWorld"> 3 <!-- 为属性赋值 --> 4 <property name="user" value="Jerry"></property> 5 </bean> 6 7 <!-- 配置一个 bean --> 8 <bean id="helloWorld2" class="com.atguigu.spring.helloworld.HelloWorld"> 9 <!-- 为属性赋值 --> 10 <!-- 通过属性注入: 通过 setter 方法注入属性值 --> 11 <property name="user" value="Tom"></property> 12 </bean>
IOC:反转资源获取方向.
DI:IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入。
1 <!-- 通过构造器注入属性值 --> 2 <bean id="helloWorld3" class="com.atguigu.spring.helloworld.HelloWorld"> 3 <!-- 要求: 在 Bean 中必须有对应的构造器. --> 4 <constructor-arg value="Mike"></constructor-arg> 5 </bean> 6 7 <!-- 若一个 bean 有多个构造器, 如何通过构造器来为 bean 的属性赋值 --> 8 <!-- 可以根据 index 和 value 进行更加精确的定位. (了解) --> 9 <bean id="car" class="com.atguigu.spring.helloworld.Car"> 10 <constructor-arg value="KUGA" index="1"></constructor-arg> 11 <constructor-arg value="ChangAnFord" index="0"></constructor-arg> 12 <constructor-arg value="250000" type="float"></constructor-arg> 13 </bean> 14 15 <bean id="car2" class="com.atguigu.spring.helloworld.Car"> 16 <constructor-arg value="ChangAnMazda"></constructor-arg> 17 <!-- 若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值. (了解) --> 18 <constructor-arg> 19 <value><![CDATA[<ATARZA>]]></value> 20 </constructor-arg> 21 <constructor-arg value="180" type="int"></constructor-arg> 22 </bean>
1 <!-- 配置 bean --> 2 <bean id="dao5" class="com.atguigu.spring.ref.Dao"></bean> 3 4 <bean id="service" class="com.atguigu.spring.ref.Service"> 5 <!-- 通过 ref 属性值指定当前属性指向哪一个 bean! --> 6 <property name="dao" ref="dao5"></property> 7 </bean> 8 9 <!-- 声明使用内部 bean --> 10 <bean id="service2" class="com.atguigu.spring.ref.Service"> 11 <property name="dao"> 12 <!-- 内部 bean, 类似于匿名内部类对象. 不能被外部的 bean 来引用, 也没有必要设置 id 属性 --> 13 <bean class="com.atguigu.spring.ref.Dao"> 14 <property name="dataSource" value="c3p0"></property> 15 </bean> 16 </property> 17 </bean> 18 19 <bean id="action" class="com.atguigu.spring.ref.Action"> 20 <property name="service" ref="service2"></property> 21 <!-- 设置级联属性(了解) --> 22 <property name="service.dao.dataSource" value="DBCP2"></property> 23 </bean> 24 25 <bean id="dao2" class="com.atguigu.spring.ref.Dao"> 26 <!-- 为 Dao 的 dataSource 属性赋值为 null, 若某一个 bean 的属性值不是 null, 使用时需要为其设置为 null(了解) --> 27 <property name="dataSource"><null/></property> 28 </bean> 29 30 <!-- 装配集合属性 --> 31 <bean id="user" class="com.atguigu.spring.helloworld.User"> 32 <property name="userName" value="Jack"></property> 33 <property name="cars"> 34 <!-- 使用 list 元素来装配集合属性 --> 35 <list> 36 <ref bean="car"/> 37 <ref bean="car2"/> 38 </list> 39 </property> 40 </bean> 41 42 <!-- 声明集合类型的 bean --> 43 <util:list id="cars"> 44 <ref bean="car"/> 45 <ref bean="car2"/> 46 </util:list> 47 48 <bean id="user2" class="com.atguigu.spring.helloworld.User"> 49 <property name="userName" value="Rose"></property> 50 <!-- 引用外部声明的 list --> 51 <property name="cars" ref="cars"></property> 52 </bean>
1 <bean id="user3" class="com.atguigu.spring.helloworld.User" 2 p:cars-ref="cars" p:userName="Titannic"></bean> 3 4 <!-- bean 的配置能够继承吗 ? 使用 parent 来完成继承 --> 5 <bean id="user4" parent="user" p:userName="Bob"></bean> 6 7 <bean id="user6" parent="user" p:userName="维多利亚"></bean> 8 9 <!-- 测试 depents-on --> 10 <bean id="user5" parent="user" p:userName="Backham" depends-on="user6"></bean> 11
depents-on:bean之间的依赖关系
<!-- 自动装配: 只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成 --> <!-- byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配. byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配 --> <!-- 在使用 XML 配置时, 自动转配用的不多. 但在基于 注解 的配置时, 自动装配使用的较多. --> <bean id="dao" class="com.atguigu.spring.ref.Dao"> <property name="dataSource" value="C3P0"></property> </bean> <!-- 默认情况下 bean 是单例的! --> <!-- 但有的时候, bean 就不能使单例的. 例如: Struts2 的 Action 就不是单例的! 可以通过 scope 属性来指定 bean 的作用域 --> <!-- prototype: 原型的. 每次调用 getBean 方法都会返回一个新的 bean. 且在第一次调用 getBean 方法时才创建实例 singleton: 单例的. 每次调用 getBean 方法都会返回同一个 bean. 且在 IOC 容器初始化时即创建 bean 的实例. 默认值 --> <bean id="dao2" class="com.atguigu.spring.ref.Dao" scope="prototype"></bean> <bean id="service" class="com.atguigu.spring.ref.Service" autowire="byName"></bean> <bean id="action" class="com.atguigu.spring.ref.Action" autowire="byType"></bean> <!-- 导入外部的资源文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <!-- 测试 SpEL: 可以为属性进行动态的赋值(了解) --> <bean id="girl" class="com.atguigu.spring.helloworld.User"> <property name="userName" value="周迅"></property> </bean> <bean id="boy" class="com.atguigu.spring.helloworld.User" init-method="init" destroy-method="destroy"> <property name="userName" value="高胜远"></property> <property name="wifeName" value="#{girl.userName}"> </property> </bean>
1 public class MyBeanPostProcessor implements BeanPostProcessor { 2 3 //该方法在 init 方法之后被调用 4 @Override 5 public Object postProcessAfterInitialization(Object arg0, String arg1) 6 throws BeansException { 7 if(arg1.equals("boy")){ 8 System.out.println("postProcessAfterInitialization..." + arg0 + "," + arg1); 9 User user = (User) arg0; 10 user.setUserName("李大齐"); 11 } 12 return arg0; 13 } 14 15 //该方法在 init 方法之前被调用 16 //可以工作返回的对象来决定最终返回给 getBean 方法的对象是哪一个, 属性值是什么 17 /** 18 * @param arg0: 实际要返回的对象 19 * @param arg1: bean 的 id 值 20 */ 21 @Override 22 public Object postProcessBeforeInitialization(Object arg0, String arg1) 23 throws BeansException { 24 if(arg1.equals("boy")) 25 System.out.println("postProcessBeforeInitialization..." + arg0 + "," + arg1); 26 return arg0; 27 } 28 29 }
1 <!-- 配置 bean 后置处理器: 不需要配置 id 属性, IOC 容器会识别到他是一个 bean 后置处理器, 并调用其方法 --> 2 <bean class="com.atguigu.spring.ref.MyBeanPostProcessor"></bean> 3 4 <!-- 通过工厂方法的方式来配置 bean --> 5 <!-- 1. 通过静态工厂方法: 一个类中有一个静态方法, 可以返回一个类的实例(了解) --> 6 <!-- 在 class 中指定静态工厂方法的全类名, 在 factory-method 中指定静态工厂方法的方法名 --> 7 <bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance"> 8 <!-- 可以通过 constructor-arg 子节点为静态工厂方法指定参数 --> 9 <constructor-arg value="2"></constructor-arg> 10 </bean> 11 12 <!-- 2. 实例工厂方法: 先需要创建工厂对象, 再调用工厂的非静态方法返回实例(了解) --> 13 <!-- ①. 创建工厂对应的 bean --> 14 <bean id="simpleDateFormat" class="java.text.SimpleDateFormat"> 15 <constructor-arg value="yyyy-MM-dd hh:mm:ss"></constructor-arg> 16 </bean> 17 18 <!-- ②. 有实例工厂方法来创建 bean 实例 --> 19 <!-- factory-bean 指向工厂 bean, factory-method 指定工厂方法(了解) --> 20 <bean id="datetime" factory-bean="simpleDateFormat" factory-method="parse"> 21 <!-- 通过 constructor-arg 执行调用工厂方法需要传入的参数 --> 22 <constructor-arg value="1990-12-12 12:12:12"></constructor-arg> 23 </bean> 24 25 <!-- 配置通过 FactroyBean 的方式来创建 bean 的实例(了解) --> 26 <bean id="user" class="com.atguigu.spring.ref.UserBean"></bean> 27
1 <!-- 2 1. 默认情况下, IOC 容器中的 bean 是单例的! 若对象是单例的, 则在创建 IOC 容器时即创建 bean 的实例, 并对 bean 的属性进行初始化. 3 2. 可以通过 bean 的 scope 属性来修改 bean 的作用域. 若取值为 prototype, 则 bean 为原型的: 每次向容器获取实例, 得到的都是一个新的对象. 4 而且, 不在创建 IOC 容器时创建 bean 的实例了. 5 3. IOC 容器中 bean 的生命周期: 6 3.1 一般地, 讨论 bean 的生命周期, 是建立在 bean 是单例的基础上的. 7 3.2 可以为 bean 指定 init 和 destroy 方法 8 3.3 还可以通过 bean 的后置处理器来更加丰富 bean 的生命周期方法(面试时.). 9 --> 10 <bean id="helloWorld" 11 class="com.atguigu.spring.helloworld.HelloWorld" 12 scope="singleton" 13 init-method="init" 14 destroy-method="destroy"> 15 <property name="userName" value="atguigu"></property> 16 </bean> 17 18 <!-- 19 1. 在 IOC 容器中配置 bean 之间的关联关系 20 --> 21 <bean id="userDao" 22 class="com.atguigu.spring.ref.UserDao"></bean> 23 24 <bean id="userService" 25 class="com.atguigu.spring.ref.UserService"> 26 <property name="userDao" ref="userDao"></property> 27 </bean> 28 29 <bean id="userAction" 30 class="com.atguigu.spring.ref.UserAction"> 31 <property name="userService" ref="userService"></property> 32 </bean>
标签:
原文地址:http://www.cnblogs.com/liuqing-bk/p/4821487.html