目录
1. Web MVC发展史历程
2.Spring概要
3.Spring-依赖注入概要(IOC)
4.属性注入的三种实现方式
5.Spring-IoC XML装配
6.Spring-XML设置Bean的值
7.Spring-IoC 注解(1)
8.Spring-IoC 注解(2)
9.Spring-AOP切面编程(1)
10.Spring-AOP切面编程(2)
未完待续...
未完待续...
一、简介
有些时候Spring装配Bean的时候,我们需要初始化一些属性的时候,我们就需要在bean中定义
- 构造注入
- setter注入
- 自动装配
二、constructor-arg
- 说明
通过指定构造方法的参数来实例化Bean - 可选属性
属性 说明 type 根据参数的类型,避免构造方法冲突 value 用于指定字符串类型、基本类型的属性值 name 属性的名称 ref 关联其它类型 index 对应于构造函数的多个参数,index属性的值从0开始 - 示例代码
java代码
xml代码public class Shop { private int shopId; private String title; private String name; public Shop() { } public Shop(int shopId, String title) { this.shopId = shopId; this.title = title; } public Shop(String title, String name) { this.title = title; this.name = name; } public Shop(int shopId, String title, String name) { this.shopId = shopId; this.title = title; this.name = name; } public int getShopId() { return shopId; } public void setShopId(int shopId) { this.shopId = shopId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Shop{" + "shopId=" + shopId + ", title='" + title + '\'' + ", name='" + name + '\'' + '}'; } }
测试代码<bean id="shop" class="com.wener.example.bean.Shop"> <!--通过构造方法注入--> <constructor-arg type="int" value="1"/> <constructor-arg type="java.lang.String" value="iPhone X"/> </bean> <!-- 或者 --> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通过构造方法注入--> <constructor-arg index="0" value="1"/> <constructor-arg index='title' value="手机"/> <constructor-arg index='2' value="iPhone X"/> </bean> <!--或者--> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通过构造方法注入--> <constructor-arg name="id" value="1"/> <constructor-arg index='1' value="手机"/> <constructor-arg index='name' value="iPhone X"/> </bean>
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Shop shop = context.getBean("shop", Shop.class); System.out.println(shop.toString());
三、property
- 说明
在 Spring 配置文件中,我们也可以通过 Bean 的属性 property 进行参数注入。使用 property 属性不但可以将 String、int 等字面值注入到 Bean 中,还可以将集合、Map 等类型注入到 Bean 中,此外还可以注入其他的 Bean
必须提供setter方法,因为需要通过名字自动装配 - 可选属性
属性 说明 name 属性的名称 value 主要是配置基本类型的属性值, ref 但是如果我们需要为Bean设置属性值是另一个Bean实例时,这个时候需要使用<ref.../>元素。使用<ref.../>元素可以指定如下两个属性。bean:引用不在同一份XML配置文件中的其他Bean实例的id属性值。local:引用同一份XML配置文件中的其他Bean实例的id属性值 - 示例代码
java代码
xml配置public class Shop { ... private ShopDetail detail; public void setDetail(ShopDetail detail) { this.detail = detail; } public ShopDetail getDetail() { return detail; } } public class ShopDetail { private String desc; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
测试代码<bean id="detail" class="com.wener.example.bean.ShopDetail"> <property name="desc" value="demo"/> </bean>
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Shop shop = context.getBean("shop", Shop.class); System.out.println(shop.getDetail().getDesc());
四、autowire
- 说明
在bean标签上通过autowire属性;或者在beans标签上通过default-autowire属性实现自动装配 - 可选值
可选值 说明 no 不使用自动装配。Bean的引用必须通过ref元素定义。 byName 根据属性名自动装配。BeanFactory查找容器中的全部Bean,找出其中id属性与属性同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入 byType 如果BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。如果有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用byType的自动装配。如果没有匹配的bean,则什么都不会发生,属性不会被设置。如果这是你不想要的情况(什么都不发生),通过设置dependency-check="objects"属性值来指定在这种情况下应该抛出错误。 constructor 这个同byType类似,不过是应用于构造函数的参数。如果在BeanFactory中不是恰好有一个bean与构造函数参数相同类型,则一个致命的错误会产生。 default 采用父级标签(即beans的default-autowire属性)的配置。 - 示例代码
java代码
根据属性名来加载public class Application { private User user; public Application(User user) { this.user = user; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } public class User implements Serializable { private String id; private String name; private String sex; private Integer age; public void destroy() { System.out.println("销毁!"); } public void init() { System.out.println("初始化!"); }
根据类型来加载<!-- xml配置 --> <bean id="application" class="com.wener.example.bean.Application" autowire="byName"/> <bean id="user" class="com.wener.example.bean.User" />
根据构造方法来加载<!-- 注意:当一个Bean即使用自动装配依赖,又使用ref显示依赖时,则显示指定的依赖就会覆盖自动装配 --> <bean id="user" class="com.wener.example.bean.User" /> <!-- xml代码 --> <bean id="app" class="com.wener.example.bean.Application" autowire="byType"/>
// java代码 public Application(User user) { this.user = user; } // xml配置 <bean id="app" class="com.wener.example.bean.Application" autowire="constructor"> </bean>
五、注入参数值详解
1、说明
在 Spring 配置文件中,用户可以通过 Bean 的属性 property 进行参数注入。使用 property 属性不但可以将 String、int 等基本注入到 Bean 中,还可以将List、Set、Map ,Properties等类型注入到 Bean 中,此外还可以注入其他的 Bean
2、基本类型注入
- 概要
一般是指可用字符串表示的值,这些值可通过<value>
元素标签进行注入。在默认情况下,基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式 - 示例代码
public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
<bean id="userId" class="com.wener.example.bean.User"> <property name="name" value="小明"/> <property name="password" value="123456"/> </bean>
3、引入其他Bean
- 概要
Spring IoC 容器中定义的 Bean 可以互相引用。<ref>
元素可以通过 bean、local、parent 三个属性引用其他 Bean 的属性,- bean 可以引用统一配置文件中或者父容器中的 Bean
- local 只能引用同一配置文件中的 Bean
- parent 只能引用父容器中的 Bean
- 示例代码
见property案例
4、内部Bean
- 概要
只会被当前的Bean所引用,不能被其它Bean引用 - 示例代码
<bean id="xx" class="com.wener.example.bean.Application"> <property name="user"> <bean class="com.wener.example.bean.User"> <property name="name" value="内部Bean"/> </bean> </property> </bean>
5、级联设置属性
- 概要
如果你想直接设置关联Bean的属性的值,可以设置级联属性 - 示例代码
<bean id="xxx" class="com.wener.example.bean.Application"> <property name="user.name" value="级联属性设置"/> </bean>
6、list
- 说明
<list>
元素进行装配,然后通过多个<value>
设置基本类型的值,也可以使用<ref>
类引用复杂的对象类型 - 示例代码
<bean id="complex" class="com.wener.example.bean.Complex"> <property name="list"> <list> <value>list1</value> <value>list2</value> <value>list3</value> <value>list4</value> <!-- 引用复杂对象 --> <!-- <ref bean="user"/> --> </list> </property> </bean>
7、map
- 说明
<map>
元素进行装配,然后通过多个<entry>
元素设值,只是entry
包含一个键值对的设置,也可以使用key-ref
属性去引用之前定义好的 Bean 作为键,而用value-ref
属性引用之前定义好的 Bean 作为值 - 示例代码
<property name="map"> <map> <entry key="k1" value="v1"/> <entry key="k2" value="v2"/> <entry key="k3" value="v3"/> <entry key="k4" value-ref="user"/> </map> </property>
8、set
- 说明
<set>
元素进行装配,可以通过value设置基本类型的值,也可以通过<ref>
去引用已经定义的Bean - 示例代码
<property name="set"> <set> <value>1</value> <value>2</value> <value>3</value> </set> </property> <property name="set"> <set> <ref bean='user'/> </set> </property>
9、array
- 说明
<array>
可以通过多个<value>
元素设值 - 示例代码
<property name="array"> <array> <value>1</value> <value>2</value> <value>3</value> <!-- <ref name="user"/> --> </array> </property>
10、properties
- 说明
<properties>
元素进行装配,通过多个<property>
元素设值,只是properties
元素有一个必填属性key
,然后可以设置值 - 示例代码
<property name="properties"> <props> <prop key="k1">v1</prop> </props> </property>
11、其它
- 集合合
子Bean可以继承父Bean的同名属性集合元素,并且使用merge属性选择是否合并,默认不合并。 - 示例代码
<bean id="parent" abstract="true" class="***"> <property name="list"> <set> <value>1</value> <value>2</value> <value>3</value> </set> </property> </bean> <bean id="child" parent="parent"> <property name="list"> <set merge="true"> <value>4</value> <value>5</value> </set> </property>
12、总结
- value:指定集合元素是基本数据类型或者字符类型值。
- ref:指定集合元素师容器中另一个Bean实例。
- bean:指定集合元素是一个嵌套Bean。
六、命名空间装配
1、概要
除了上述的配置方式外,Spring3.0以上的版本还为上述的方式提供了一些简写方式
2、c
- 说明
命名空间-c属性名以 “c:” 开头,也就是命名空间的前缀,通过构造器注入的方式来配置 bean,接下来就是要装配的构造器参数名 - 示例代码
<beans ... xmlns:c="http://www.springframework.org/schema/c"> </beans>
<!-- 未引入之前--> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通过构造方法注入--> <constructor-arg type="int" value="1"/> <constructor-arg type="java.lang.String" value="iPhone X"/> </bean> <!--简写方式 --> <bean id="shop" class="com.wener.example.bean.Shop" c:shopId="1" c:name="测试"/>
3、p
- 说明
命名空间-p通过setter的注入方式来配置 bean - 示例代码
<!-- 未引入之前--> <bean id="userId" class="com.wener.example.bean.User" scope="prototype"> <property name="name" value="小明"/> <property name="password" value="123456"/> </bean> <!--简写方式 --> <bean id="user4" class="com.wener.example.bean.User" p:name="admin" p:password="123"/> <bean id="app" class="com.wener.example.bean.Application" p:user-ref="user" />
4、util
- 说明
工具类的命名空间,可以简化集合类元素的配置 - util命名空间表
元素 描述 <util:list>
创建一个 java.util.List
类型的 bean,其中包含值或引用<util:map>
创建一个 java.util.map
类型的 bean,其中包含值或引用<util:properties>
创建一个 java.util.Properties
类型的 bean<util:property-path>
引用一个 bean 的属性(或内嵌属性),并将其暴露为 bean <util:set>
创建一个 java.util.Set
类型的 bean,其中包含值或引用<util:constant>
引用某个类型的 public static
域,并将其暴露为 bean
5、util:list
- 说明
可以通过util:list
来定义一个java.util.List
类型的bean,其子元素就是对应的List的元素,其子元素可以是一切可以用来定义对象的元素,比如value、bean等,
默认元素的值是String类型,可以通过value-type
属性指定元素值的类型,比如数字类型则指定value-type="java.lang.Integer"
默认生成的是java.util.ArrayList
类型的List,如果需要使用其它类型的List,则可以通过list-class
来指定。比如下面就指定了生成的List是java.util.LinkedList
- 示例代码
<bean id="complex" class="com.wener.example.bean.Complex" p:list="list"/> <util:list id="list" value-type="java.lang.String" list-class="java.util.LinkedList"> <value>1</value> <value>2</value> <value>3</value> </util:list>
6、util:map
- 说明
通过util:map
来定义一个Map类型的, Map中的每一个Entry则由其子元素entry来定义。每个Entry的key和value可以通过entry元素的key和value属性来定义
默认key和value的值是String类型,如果想修改类型可以通value-type
属性指定value的类型,如果是复制的类型可以通过value-ref来引入
默认生成的是`java.util.HashMap,如果想使用其他类型的Map,可以通过map-class来指定 - 示例代码
<util:map id="map" value-type="java.lang.Object" key-type="java.lang.Object"> <entry value-ref="list" key-ref="set"/> </util:map>
7、util:set
- 说明
通过util:set
来定义一个java.util.Set
类型的bean。它的用法和util:list
是类似的。
通过value子元素指定的值默认也是java.lang.String
类型,可以通过value-type
属性来指定元素类型
默认生成的Set是java.util.LinkedHashSet
类型,可以通过set-class
属性来指定生成的Set的类型 - 示例代码
<util:set id="set" value-type="java.lang.Integer" set-class="java.util.HashSet"> <value>1</value> <value>2</value> <value>3</value> </util:set>
8、util:properties
- 说明
可以通过util:properties
快速的定义一个Properties对象,可以通过其子元素<prop key=""></prop>
来定义一个Properties的元素,key对应属性名,而<prop>
元素中间的文本值则为对应的属性值
util:properties
的内容也可以来自一个外部文件,此时可以通过location属性引用对应的外部文件,通过location属性指定的本地文件也可以是多个,多个文件之间可以通过英文的逗号分隔 - 示例代码
<util:properties id="properties"> <prop key="a">a</prop> <prop key="b">b</prop> </util:properties>
<!--在工程的Resources目录下新建一个 util.properties的文件 --> <util:properties id="properties" location="util.properties,xxx.properties"/>
9、util:constant
- 说明
util:constant
可以把一个常量定义为bean容器中的一个bean,可以通过id属性指定对应的bean的id。static-field
用来指定引用的static变量,需要是public类型的 - 示例代码
public static final Integer ERROR = -1; <util:constant id="error" static-field="com.wener.example.bean.Application.ERROR" />
10、util:property-path
- 说明
util:property-path
可以用来把某个bean的某个属性的值定义为一个bean, - 示例代码
<util:property-path id="username" path="user_path.name"/> <bean id="user_path" class="com.wener.example.bean.User" scope="prototype"> <property name="name" value="小明"/> <property name="password" value="123456"/> </bean>