Spring-1-day--对象的注册
一、Spring对象注册的简单配置
1.Spring对象注册必须的jar包。
对象注册必须的四个包:beans,context,core和expression四个包,另外还有两个日志包,Apache的logging包和log4j包。
2.书写一个对象。
package cn.guanyq;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3.导入约束。
导入beans的约束。
4.对对象的注册完成配置。
将上面创建的对象交给Spring管理。
<bean name="user" class="需要被管理对象的完整类名"></bean>
字这用到<bean></bean>,内部的name属性可以随便起一个名字,用作从Spring中取出时用,class则为需要放入的对象的完整类名。
二、Spring概念
-
-
ioc
-
ioc就是inverse of control,反转控制,也就是将我们对象创建的方式反转了,使用Spring之后对象的创建以及依赖的注入,都完全交给Spring来完成。
-
-
di
-
dependency injection 依赖注入,实现ioc思想就需要依赖注入技术的支持。依赖注入根据方式又分为:set方法注入,构造方法注入,以及字段注入。根据注入类型又分为:基本类型注入,引用类型的注入(注入对象),形成依赖关系。
-
-
applicationContext和beanFactory
-
beanFactory是一个接口,Spring的最原始接口,实现类的功能比较单一,实现这个接口的容器,只有在每次获得对象的时候才会获得对象。
applicationContext接口,每次容器启动时就会创建对象,并具有更多的功能。实现类ClassPathXmlApplicationContext(src路径),会从src路径下加载配置文件。
实现类FileSystemXmlApplicationContext(磁盘绝对路径)加载配置文件。
三、Spring配置的详解。
1.配置详解
<bean name="user" class="需要被管理对象的完整类名" scope="singleton"></bean>
<bean>使用这个元素来描叙需要Spring来管理的对象。而name属性,则是指定取出对象时使用的名字,可以重复(但不建议重复),也可以是特殊字符,已经取代id属性,而class属性则是需要被管理的对象的完整类名。scope属性则是指定这个对象在Sping容器中是否会被创建多次,其默认值为singleton,也就是单例对象,在整个Spring容器中只会被创建一次,每次取出都取出的为同一个对象,如果每次取出都希望取出不同的对象,则可以将scope设置为prototype,即为多例对象。在Spring和strut2整合时就需要将Action对象指定为多例对象。因为每次的请求都会创建一个不同的Action。scope还有另外两个取值,分别为request和response,在web环境下分别和request和response的生命周期相同。
2.Spring是如何创建对象的。
上面的配置方式即为Spring利用对象的空参构造器创造对象,另外还有两种,则分别为:静态工厂和实例工厂,配置则有些麻烦。
3.分模块来配置,引入其他配置文件。
<import resource="其他配置文件的src下路径"></import>
4.容器的配置
在web环境下容器需要跟随项目的启动而创建,不能每次获得对象时都创建一个容器,因此可以将容器的创建放在ContextServlet域创建的监听器内。跟随项目的启动而创建,项目的 关闭而销毁。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
5.从Action中获得容器
//获得ServletContext域
ServletContext sc= servletAcationContext.getServletContext();
//获得容器
WebApplicationContext ac= webApplicationContextUtils.getWebApplicationContext(sc);
//从容器中获得对象。
User user=(User) ac.getBean("user");
四、属性注入
-
注入方式
1.1set方法注入
<bean name="user" class="user的完整类名"scope="singleton">
<property name="name"value="tom"></property>
<property name="age"value="18"></property>
</bean>
上面例子为简单的值类型注入,如果要注入一个引用类型,则需要:
1 <bean name="user" class="user类路径"scope=“singleton“> 2 <property name="name" value="tom"></property> 3 <property name="name" value="tom"></property> 4 <property name="car" ref="car"></property> 5 </bean> 6 7 <bean name="car" class="car完整类名" scope=“singleton”> 8 <property name="name" value="大众"></property> 9 <property name="color" value="black"></property> 10 </bean>
如果需要注入对象,则需要先将要注入的对象进行注册,再注入。第4行的ref的car就是第7行name的car。
1.2构造函数注入
<bean name="user" class="user的完整类名">
<constructor-arg name="name" index="0" type="java.lang.String" value="tom"></constructor-arg>
<constructor-arg name="age" index="1" type="java.lang.Integer" value="18"></constructor-arg>
</bean>
其中name属性为构造函数的参数名,index为构造函数的参数所在位置的索引,type为构造函数参数的类型。
1.3 p名称空间注入
p名称空间的注入需要导入一个p名称空间。
<bean name="user" class="" p:name="tom" p:age="18" p:car-ref="car" ></bean>
<bean name="car" class="" p:name="大众" p:color="black" ></bean>
其中p:属性名=“值”,来进行值得注入。用p:属性名-ref=“bean名称”来进行引用对象的注入
1.4 spel注入
spring特有的表达式语言
2. 复杂类型的注入
2.1 数组的注入
如果数组中只有一个元素直接用value或者ref注入即可。如果有多个元素则:
<property name="arr">
<array>
<value>1</value>
<value>2</value>
<ref bean="car">
</array>
</property>
数组中的注入利用property,其中name为数组在类中的名字。value来注入基本值,利用ref来注入引用类型。
2.2 map的注入
<property name="map">
<map>
<entry key="" value=""></entry>
<entry key="" value-ref=""></entry>
</map>
</property>
<entry>表示是map,其中的key和value分别对应map 的键值对。如果value为引用类型,则使用value-ref来指定。
2.3 list的注入
list的注入基本和array的注入方式相似
<property name="list">
<list>
<value>1</value>
<ref bean="car"/>
</list>
</property>
用value来注入基本的数据类型,而引用类型则用ref中的bean来指定。
2.4 properties的注入
<property name="prop">
<props>
<prop key="name">tom</prop>
</props>
</property>

浙公网安备 33010602011771号