Spring介绍
Spring 是一个开源框架,为了解决企业应用的复杂性而创立的,他方便 解耦,简化开发 可以将所有对象创建和依赖关系维护,交给 Spring 管理 ;Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程;降低 JavaEE API 的使用难度,Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低.
Spring项目的的搭建
1.项目创建:通过idea创建一个maven项目
2.引入Spring的依赖:
创建一个xml文件并把下列这些导进去
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <spring.version>4.2.5.RELEASE</spring.version> </properties> <!--Spring核心基础依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <!--日志相关--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--测试相关--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
3.添加配置文件
配置文件的名字可以任意设置,建议设置为applicationContext.xml,所以这里我们创建一个名为applicationContext.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.xsd">
</beans>
4.添加相应的模块层代码
在项目中添加dao,model,service层代码
5. 将bean 的实例化交给Spring
在添加的3配置文件中在添加下列代码
<bean name="userDao" class="com.tledu.spring.dao.impl.UserDaoImpl" /> <!--name 属性名字/ref 引用的bean的名字--> <bean id="userService" class="com.tledu.spring.service.UserService"> <property name="userDao" ref="userDao" /> </bean>
6.创建一个测试类
在test目录下的java中创建一个测试类如下:
public class UserServiceTest { @Test public void add() { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); // userService是bean的id或name UserService userService = (UserService) applicationContext .getBean("userService"); userService.add(null); } }
6.1 通过构造方法注入
<bean name="userDao" class="com.tledu.spring.dao.impl.UserDaoImpl" />
<bean id="userService" class="com.tledu.spring.service.UserService">
<constructor-arg ref="userDao"/>
</bean>
6.2普通属性注入
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl">
<!-- 如果不是指向对象,直接用value设置值就行 -->
<property name="daoId" value="82"></property>
<property name="daoStatus" value="good"></property>
</bean>
7.scope(IOC容器)
scope的取值有5种取值:
在Spring 2.0之前,有singleton和prototype两种;
在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用
7.1 singleton
此取值时表明容器中创建时只存在一个实例,所有引用此bean都是单一实例。
也就是说创建对象是单例模式,并且如果不进行设置,默认就行单例
7.2 prototype
spring容器在进行输出prototype的bean对象 时,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求 方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一 个新的实例之后,就由这个对象“自生自灭”,最典型的体现就是spring与struts2进行整合时,要把action的scope改为 prototype。
简单来说,就是每次获取都创建一个新对象,并且这个对象的生命周期不归Spring管理
配置scope的方式:
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl">
<!-- 如果不是指向对象,直接用value设置值就行 -->
<property name="daoId" value="82"></property>
<property name="daoStatus" value="good"></property>
</bean >
<!-- scope singleton : 单例 只创建一个,默认就是
prototype : 每一次getBean 都会创建一个新的实例化对象
request,session : 需要特殊环境支持 -->
<bean id="userService" class="com.tledu.zrz.service.UserService"
scope="singleton">
<!-- 构造方法注入 -->
<constructor-arg>
<ref bean="userDao" />
</constructor-arg>
</bean>
8. 集合属性注入
配置文件
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl">
<property name="lists" >
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<property name="sets" >
<!-- set不可重复,重复不添加,所以只有第一个三 -->
<set>
<value>3</value>
<value>3</value>
<value>5</value>
<value>4</value>
</set>
</property>
<property name="maps">
<!-- mapkey不可重复,重复key不添加,value覆盖 -->
<map>
<entry key="1" value="2"></entry>
<entry key="1" value="3"></entry>
<entry key="2" value="2"></entry>
</map>
</property>
</bean>
<bean id="userService" class="com.tledu.zrz.service.UserService"
scope="singleton">
<!-- 构造方法注入 -->
<constructor-arg>
<ref bean="userDao" />
</constructor-arg>
</bean>
9自动装配
Autowire : 自动装配,两种取值
1 byName
2 byType
9.1 byName
byName是根据setter方法名字进行匹配,如果找不到,就不赋值
如 setUserDao 方法 就会找userDao,如果 bean的ID为 UserDao 也一样找不到,区分大小写
设置方式
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.tledu.zrz.service.UserService"
autowire="byName">
</bean>
9.2 byType
byType是根据setter方法的参数列表中的数据类型进行匹配,如果beans.xml中出现了多个相同类型的对象,就会报错
如 setUserDao(UserDao userDao) 方法 就会找UserDao,如果是接口,就找对应的实现类对象
设置方式
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.tledu.zrz.service.UserService"
autowire="byType">
</bean>