什么是spring
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1 . 中间层框架、万能胶
struts2
spring
hibernate
2 . 容器框架
JavaBean 项目中的一个个类
IOC和AOP
案例一:Spring解决的问题
接口UserBiz.java
package com.xwt.ioc.biz;
/**
* 实现业务功能的接口
* 通过企业的案例来讲解使用spring ioc的必要性
* v1.0: 实现游戏上传功能
* v2.0: 对游戏的上传功能进行优化
* @author wt
*
*/
public interface UserBiz {
public void upload();
}
UserBizImpl1.java
package com.xwt.ioc.biz.impl;
import com.xwt.ioc.biz.UserBiz;
/**
* 实现游戏上传功能 没有考虑性能
* @author wt
*
*/
public class UserBizImpl1 implements UserBiz{
@Override
public void upload() {
System.out.println("v1:实现用户上传的功能");
}
}
UserBizImpl2.java
package com.xwt.ioc.biz.impl;
import com.xwt.ioc.biz.UserBiz;
/**
* 对游戏的上传功能进行优化
* @author wt
*
*/
public class UserBizImpl2 implements UserBiz{
@Override
public void upload() {
System.out.println("v2:开始优化性能的代码");
}
}
UserAction.java
package com.xwt.ioc.biz.web;
import com.xwt.ioc.biz.UserBiz;
import com.xwt.ioc.biz.impl.UserBizImpl1;
public class UserAction {
private UserBiz userBiz=new UserBizImpl1();
public void upload() {
userBiz.upload();
}
}
测试IocTest.java
package com.xwt.ioc.biz.test;
import com.xwt.ioc.biz.web.UserAction;
public class IocTest {
public static void main(String[] args) {
UserAction user=new UserAction();
user.upload();
}
}
目前存在问题:如果说多个action类要使用同一个UserBiz接口,那么一旦biz实现类发生改变那么就需要程序员改动每一个action中的代码 ,去改变该biz接口的具体应用的实现类
案例二:Springioc就解决上述问题
实现了一处改动 多处受益的结果
UserAction.java
package com.xwt.ioc.biz.web;
import com.xwt.ioc.biz.UserBiz;
public class UserAction {
private UserBiz userBiz;
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public void upload() {
userBiz.upload();
}
}
TeacherAction.java
package com.xwt.ioc.biz.web;
import com.xwt.ioc.biz.UserBiz;
import com.xwt.ioc.biz.impl.UserBizImpl1;
public class TeacherAction {
private UserBiz userBiz;
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public void upload() {
userBiz.upload();
}
}
spring-context.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean class="com.xwt.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
<bean class="com.xwt.ioc.biz.web.UserAction" id="userAction">
<property name="userBiz" ref="userBiz"></property>
</bean>
<bean class="com.xwt.ioc.biz.web.TeacherAction" id="TeacherAction">
<property name="userBiz" ref="userBiz"></property>
</bean>
</beans>
测试IocTest.java
package com.xwt.ioc.biz.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xwt.ioc.biz.web.TeacherAction;
import com.xwt.ioc.biz.web.UserAction;
public class IocTest {
public static void main(String[] args) {
ApplicationContext springContex= new ClassPathXmlApplicationContext("/spring-context.xml");
UserAction userAction=(UserAction) springContex.getBean("userAction");
TeacherAction teacherAction=(TeacherAction) springContex.getBean("TeacherAction");
userAction.upload();
teacherAction.upload();
}
}
案例三:Spring的注入方式
1.set注入
UserAction.java
package com.xwt.ioc.biz.web;
import java.util.List;
import com.xwt.ioc.biz.UserBiz;
/**
* IOC的注入方式及各类类型
* 1、set注入
* 基本类型与String
* 数组
* 自定义类型
*
* 2、构造注入
* 3、自动装配
* @author wt
*
*/
public class UserAction {
private UserBiz userBiz;
private String uname;
private int age;
private List<String> love;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getLove() {
return love;
}
public void setLove(List<String> love) {
this.love = love;
}
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public void upload() {
userBiz.upload();
}
public void test1() {
System.out.println(this.uname);
System.out.println(this.age);
System.out.println(this.love);
}
}
spring-context.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean class="com.xwt.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
<bean class="com.xwt.ioc.biz.web.UserAction" id="userAction">
<property name="userBiz" ref="userBiz"></property>
<!-- set注入用property标签 -->
<property name="uname" value="小乌龟"></property>
<property name="age" value="17"></property>
<property name="love">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
</bean>
<bean class="com.xwt.ioc.biz.web.TeacherAction" id="TeacherAction">
<property name="userBiz" ref="userBiz"></property>
</bean>
</beans>
测试IocTest.java
package com.xwt.ioc.biz.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xwt.ioc.biz.web.TeacherAction;
import com.xwt.ioc.biz.web.UserAction;
public class IocTest {
public static void main(String[] args) {
ApplicationContext springContex= new ClassPathXmlApplicationContext("/spring-context.xml");
UserAction userAction=(UserAction) springContex.getBean("userAction");
userAction.test1();
}
}
2 . 构造注入
UserAction.java
package com.xwt.ioc.biz.web;
import java.util.List;
import com.xwt.ioc.biz.UserBiz;
/**
* IOC的注入方式及各类类型
* 1、set注入
* 基本类型与String
* 数组
* 自定义类型
*
* 2、构造注入
* 3、自动装配
* @author wt
*
*/
public class UserAction {
private UserBiz userBiz;
private String uname;
private int age;
private List<String> love;
public UserAction() {}
public UserAction(String uname, int age) {
this.uname = uname;
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getLove() {
return love;
}
public void setLove(List<String> love) {
this.love = love;
}
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public void upload() {
userBiz.upload();
}
public void test1() {
System.out.println(this.uname);
System.out.println(this.age);
System.out.println(this.love);
}
}
spring-context.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean class="com.xwt.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
<bean class="com.xwt.ioc.biz.web.UserAction" id="userAction">
<property name="userBiz" ref="userBiz"></property>
<!-- 构造注入用constructor-arg标签 -->
<constructor-arg name="uname" value="小王八"></constructor-arg>
<constructor-arg name="age" value="19"></constructor-arg>
<property name="love">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
</bean>
<bean class="com.xwt.ioc.biz.web.TeacherAction" id="TeacherAction">
<property name="userBiz" ref="userBiz"></property>
</bean>
</beans>
测试IocTest.java
package com.xwt.ioc.biz.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xwt.ioc.biz.web.TeacherAction;
import com.xwt.ioc.biz.web.UserAction;
public class IocTest {
public static void main(String[] args) {
ApplicationContext springContex= new ClassPathXmlApplicationContext("/spring-context.xml");
UserAction userAction=(UserAction) springContex.getBean("userAction");
userAction.test1();
}
}
3 . 自动装配
spring4之后出现的
byType: spring框架根据接口自动在spring的上下文中去寻找与之匹配的实现类,进行自动注入
如果在spring上下文中有连个匹配上的,那会报错
byName: spring框架根据接口的名字(属性名)去上下文进行寻找,是通过Bean标签的id进行寻找
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
default-autowire="byType"
<!-- default-autowire="byName" -->
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean class="com.xwt.ioc.biz.impl.UserBizImpl1" id="userBiz"></bean>
<bean class="com.xwt.ioc.biz.web.UserAction" id="userAction">
<!-- <property name="userBiz" ref="userBiz"></property> -->
<!-- set注入用property标签 -->
<!-- <property name="uname" value="小乌龟"></property> -->
<!-- <property name="age" value="17"></property> -->
<!-- 构造注入用constructor-arg标签 -->
<constructor-arg name="uname" value="小王八"></constructor-arg>
<constructor-arg name="age" value="19"></constructor-arg>
<property name="love">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
</bean>
<bean class="com.xwt.ioc.biz.web.TeacherAction" id="TeacherAction">
<!-- <property name="userBiz" ref="userBiz"></property> -->
</bean>
</beans>
案例四:Spring与web容器的整合原理
实现的目标:
在用户每一次发送任意请求,在对应请求处理代码中可以获取到spring容器中配置的任意的JavaBean,从而可以对应的javabean中定义的方法
实现思路:
1、在tomcat启动的时候自动去加载spring的上下文(ApplicationContext)
2、利用监听器去把spring的上下文放到tomcat的上下文中
3、为了解决框架的配置文件冲突的问题,我们需要动态指定spring上下文的配置文件名称;
SpringLoaderListener.java
package com.xwt.ioc.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* spring 作为管理整个工程中所有的javaBean
* 那么如何在用户发送请求的时候能够访问到指定的JavaBean
* 处理方式:
* 在监听器中将spring的上下文交给tomcat的上下文中进行管理
* 浏览器--->request--->servletContext--->任意的JavaBean
* @author wt
*
*/
@WebListener
public class SpringLoaderListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("tomcat启动会加载的方法");
//1、在tomcat启动的时候自动去加载spring的上下文(ApplicationContext)
ServletContext servletContext = sce.getServletContext();
String springXmlLocation = servletContext.getInitParameter("springXmlLocation");
if(springXmlLocation == null || "".equals(springXmlLocation)) {
springXmlLocation = "/spring-context.xml";
}
System.out.println("Spring上下配置文件是:"+springXmlLocation);
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(springXmlLocation);
servletContext.setAttribute("spring_key", applicationContext);
}
}
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!-- 监听器的参数 -->
<context-param>
<param-name>springXmlLocation</param-name>
<param-value>/spring-xwt.xml</param-value>
</context-param>
</web-app>
UserServlet.java
package com.xwt.ioc.biz.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理用户请求");
ApplicationContext springContext = (ApplicationContext) req.getServletContext().getAttribute("SPRING_WEB_KEY");
UserAction userAction=(UserAction) springContext.getBean("userAction");
userAction.test1();
}
}