Spring4入门(一)_hm
Spring4-2.4简介
Spring3.x(整合hibernate3.x)和Spring4.x
Spring:开源,SE/EE开发的一站式框架
一站式框架:有EE开发的每一层解决方案
WEB层 :SpringMVC
Service层 :Spring的Bean管理,Spring声明式事务
DAO层 :Spring的Jdbc模板,Spring的ORM模块(整合Hibernate)
搭建Spring开发环境:Spring入门(IOC)
IOC:将对象的创建权反转给Spring
控制反转(Inversion of Control,缩写为IoC),是面向对象中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
step1:Spring开发下载jar包
1、spring-framework-3.0.2.RELEASE-dependencies.zip:依赖库
2、spring-framework-4.2.4.RELEASE-dist.zip:完整jar包
将spring-framework-4.2.4.RELEASE-dist.zip解压后的目录结构
1、docs :Spring的开发规范和API
2、libs :Spring的开发的jar和源码
3、schema :Spring的配置文件的约束
step2:IOC的开发需要引入的jar包
方式一:复制jar包到项目
核心容器
1、spring-beans-4.2.4.RELEASE.jar
2、spring-context-4.2.4.RELEASE.jar
3、spring-core-4.2.4.RELEASE.jar
4、spring-expression-4.2.4.RELEASE.jar
关于日志的包
5、com.springsource.org.apache.commons.logging-1.1.1.jar:日志记录接口规范
6、com.springsource.org.apache.log4j-1.2.15.jar
方式二:Maven的pom.xml配置
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency>
step3:创建接口和类
接口
package com.spring.demo; public interface UserDAO { public void save() ; }
类
package com.spring.demo; public class UserDAOImpl implements UserDAO { @Override public void save() { System.out.println("UserDAO的实现类.........."); } }
PS:Spring底层实现是工厂设计模式+反射+配置文件实现程序解耦合
step4:配置文件applicationContext.xml
在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html页面的底部有参照
<?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"> <!-- Spring的入门配置 --> <bean id="userDAO" class="com.spring.demo.UserDAOImpl"></bean> </beans>
Spring默认的配置文件名applicationContext.xml
step5:编写测试类
public void demo() { //创建Spring的工厂 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ; //getBean中的参数对应配置文件中id属性值 UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO") ; userDAO.save(); }
IOC和DI的关系
IOC:控制反转,将对象的创建权反转给了Spring
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来
面向对象的对象间关系
1、依赖:例如:
Class A{} Class B{ public void xxx(A a){ //这个方法的参数需要A类的实例,成为依赖 } }
2、继承
3、聚合
DI的示例:在Spring创建实例对象的过程中,为该对象的属性赋值,称为DI
1、在UserDAOImpl.java中添加name属性和setName方法
package com.spring.demo; public class UserDAOImpl implements UserDAO { private String name ; public void setName(String name) { this.name = name ; } @Override public void save() { System.out.println("UserDAO的实现类.........." + name); } }
2、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"> <!-- Spring的入门配置 --> <bean id="userDAO" class="com.spring.demo.UserDAOImpl"> <property name="name" value="DI赋值name属性"></property> </bean> </beans>
Spring工厂类
继承结构

PS:ApplicationContext继承BeanFactory
BeanFactory:老版本的工厂类
1、BeanFactory:调用getBean的时候,才会生成类的实例
2、两种工厂类的使用方式是一样的
ApplicationContext :新版本的工厂类
1、加载配置文件的时候,就会将Spring管理的类都实例化。(是否是单例?)
2、有两个实现类:
ClassPathXmlApplicationContext :加载类路径下的配置文件(一般将配置文件放在项目下,故一般使用这个类)
FileSystemXmlApplicationContext :加载文件系统下的配置文件(硬件磁盘,盘符开头)
XML提示配置

Bean的配置
bean标签的id和name
1、id:使用了约束中的唯一约束。里面不能出现特殊字符的。
2、name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。(Spring和Struts1框架整合的时候必须使用name,使用时的参照<bean name=”/user” class=””/>)
Bean生命周期的配置
这个配置不是那么重要(了解)
1、init-method :Bean被初始化的时候执行的方法
2、destroy-method :Bean被销毁的时候执行的方法(前提Bean是单例创建,默认Bean是单例创建,工厂关闭)
PS:当ClassPathXmlApplicationContext加载类路径下的配置文件,就会创建Bean的对象,使用ClassPathXmlApplicationContext对象的close方法将会销毁Bean的对象
配置文件applicationContext.xml
<bean id="userDao" class="com.itheima.dao.impl.UserDao" init-method="init" destroy-method="destroy"></bean>
UserDao.java
public class UserDao implements IUserDao { @Override public void addUser(User user) { System.out.println("执行addUser方法........."); } public void init(){ System.out.println("执行init方法....."); } public void destroy(){ System.out.println("执行destroy方法....."); } }
测试代码
@Test public void test04(){ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ; UserDao userDao = applicationContext.getBean("userDao", UserDao.class); userDao.addUser(new User()); applicationContext.close(); }
Bean的作用范围的配置(**)
scope 属性配置Bean的作用范围,取值范围:
在实际开发中,常用的就是前面的两个
1、singleton :默认的,Spring会采用单例模式创建这个对象。
2、prototype :多例模式。(Struts2和Spring整合一定会用到)
3、request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
4、session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
5、globalsession :应用在web项目中,必须在porlet环境下使用(在一处登录,则在其子系统中不用再次登录,例如:在百度中登录,在百度网盘就不用再次登录)。但是如果没有这种环境,相对于session。
属性注入
Spring支持两类的方式:构造器的方式、为类的属性设置set方法(****)
1、构造方法的属性注入
创建类User.java
package com.spring.demo; public class User { private String name ; private String password ; public User(String name, String password) { super(); this.name = name; this.password = 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; } @Override public String toString() { return "User [name=" + name + ", password=" + password + "]"; } }
applicationContext.xml配置文件中的配置
<!-- 构造方法的属性注入 -->
<bean id="user" class="com.spring.demo.User">
<constructor-arg name="name" value="javaweb"/>
<constructor-arg name="password" value="123"/>
</bean>
测试代码
@Test public void demo() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ; User user = (User) applicationContext.getBean("user") ; System.out.println(user); }
2、set方法方式的属性注入
step1:创建类
Car.java(Javabean)
package com.spring.demo; public class Car { private String name ; private double price ; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Car [name=" + name + ", price=" + price + "]"; } }
Employee.java(javabean)
package com.spring.demo; public class Employee { private String username ; private Car car ; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Employee [username=" + username + ", car=" + car + "]"; } }
step2:配置文件
<!-- set方法的方式 --> <bean id="car" class="com.spring.demo.Car"> <property name="name" value="奥迪"/> <property name="price" value="300000"></property> </bean> <!-- set方法注入引用对象类型的属性 --> <bean id="employee" class="com.spring.demo.Employee"> <!-- value:设置普通类型的值,ref:设置其他的类id或name,例如上面设置了的id为car --> <property name="username" value="张三"/> <property name="car" ref="car"></property> </bean>
step3:测试代码
public void demo() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ; Employee employee = (Employee) applicationContext.getBean("employee") ; System.out.println(employee); }
PS:构造方法的属性注入方式要注入的是引用类型,和这种方式配置类似
3、P名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入:格式如下
普通属性 p:属性名=”值”
对象属性 p:属性名-ref=”值”
step1:p名称空间的引入

step2:使用p名称空间
<!-- 改为p名称空间的方式 --> <bean id="car" class="com.spring.demo.Car" p:name="路虎" p:price="300000"></bean> <bean id="employee" class="com.spring.demo.Employee" p:name="张三" p:car-ref="car"></bean>
SpEL的属性注入(Spring3.0以后)
SpEL:Spring Expression Language,Spring的表达式语言,语法格式: #{SpEL}
部分配置示例:参考Spring表达式手册
<!-- SpEL的属性注入 --> <bean id="carInfo" class="com.spring.demo.CarInfo"> </bean> <bean id="car" class="com.spring.demo.Car"> <property name="name" value="#{carInfo.name}"></property> <property name="price" value="#{carInfo.calculatorPrice()}"></property> </bean> <bean id="employee" class="com.spring.demo.Employee"> <property name="name" value="#{'张三'}"></property> <property name="car" value="#{car}"></property> </bean>
CarInfo.java
public class CarInfo { private String name; public String getName() { return "摩托车"; } public Double calculatorPrice(){ return Math.random() * 3000; } }
集合类型属性注入(了解)
step1:在类中设置相应类型的属性,并提供set方法
step2:配置文件applicationContext.xml配置
<!-- Spring的集合属性的注入============================ --> <!-- 注入数组类型 --> <bean id="collectionBean" class="com.spring.demo.CollectionBean"> <!-- 数组类型 --> <property name="arrs"> <list> <value>张三</value> <value>李四</value> <value>王五</value> </list> </property> <!-- 注入list集合 --> <property name="list"> <list> <value>赵六</value> <value>王霸</value> <value>李九</value> </list> </property> <!-- 注入set集合 --> <property name="set"> <set> <value>aaa</value> <value>bbb</value> <value>ccc</value> </set> </property> <!-- 注入Map集合 --> <property name="map"> <map> <entry key="aaa" value="111"/> <entry key="bbb" value="222"/> <entry key="ccc" value="333"/> </map> </property> </bean>
Spring分模块开发配置
1、在加载配置文件的时候,加载多个 ,利用ClassPathXmlApplicationContext
//创建Spring的工厂时,加载多个配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml") ;
2、在一个配置文件中引入多个配置文件
引入src下的配置文件,如果在包中需要添加相应的路径
<import resource="applicationContext.xml"/>
Spring整合WEB项目

zwy

浙公网安备 33010602011771号