spring框架之IOC
spring简介
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
Spring的初衷:
1、JAVA EE开发应该更加简单。
2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。
3、为JavaBean提供了一个更好的应用配置框架。
4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。
5、尽量减少不必要的异常捕捉。
6、使应用程序更加容易测试。
Spring的目标:
1、可以令人方便愉快的使用Spring。
2、应用程序代码并不依赖于Spring APIs。
3、Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。
Spring的基本组成:
1、最完善的轻量级核心框架。
2、通用的事务管理抽象层。
3、JDBC抽象层。
4、集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps。
5、AOP功能。
6、灵活的MVC Web应用框架。
优点
◆JAVA EE应该更加容易使用。
◆面向对象的设计比任何实现技术(比如JAVA EE)都重要。
◆面向接口编程,而不是针对类编程。Spring将使用接口的复杂度降低到零。(面向接口编程有哪些复杂度?)
◆代码应该易于测试。Spring框架会帮助你,使代码的测试更加简单。
◆JavaBean提供了应用程序配置的最好方法。
◆在Java中,已检查异常(Checked exception)被过度使用。框架不应该迫使你捕获不能恢复的异常。
今天我们主要讲的是IOC
三种注入方式
set注入
1.基本数据类型
实体类提供属性的get,set方法
/**
* 1.spring管理bean的方式(注入方式)
* set注入
* 基本数据类型
* 引用数据类型
* 构造注入
* 自动装配
* @author Administrator
*
*/
public class UserAction {
private UserBiz ub;
private int uid;
private String uname;
private List<String> hobby=new ArrayList<String>();
public UserBiz getUb() {
return ub;
}
public void setUb(UserBiz ub) {
this.ub = ub;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
/**
* set注入
*/
public void test1() {
System.out.println("uid:"+this.uid);
System.out.println("uname:"+this.uname);
System.out.println("hobby:"+this.hobby);
}
}
<?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"
default-autowire="byName"
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 id="userBiz2" class="com.xyx.ioc.biz.impl.UserBizImpl1"></bean>
<bean id="userBiz" class="com.xyx.ioc.biz.impl.UserBizImpl2"></bean>
<bean id="userAction" class="com.xyx.ioc.web.UserAction">
<!-- <property name="uid" value="22"></property>
<property name="uname" value="zs"></property> -->
<property name="userBiz" ref="userBiz"></property>
<constructor-arg name="uid" value="22"></constructor-arg>
<constructor-arg name="uname" value="zs"></constructor-arg>
<property name="hobby">
<list>
<value>唱</value>
<value>条</value>
<value>rap</value>
<value>篮球</value>
<value>靖港</value>
</list>
</property>
</bean>
</beans>
UserBiz set get注入
private UserBiz userBiz;
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
配置为:
<bean id="ub" class="com.shl.ioc.impl.UserBizImpl1"></bean>
<property name="ub" ref="ub"></property>
构造注入
提供构造方法
public UserAction(int uid, String uname) {
super();
this.uid = uid;
this.uname = uname;
}
<constructor-arg name="uid" value="11"></constructor-arg>
<constructor-arg name="uname" value="bbb"></constructor-arg>
Demo1
/**
* 模拟浏览器请求后台
* @author XYX
*
*/
public class Demo1 {
public static void main(String[] args) {
// UserAction userAction=new UserAction();
// userAction.test3();
// userAction.test1();
// 建模
ApplicationContext context=new ClassPathXmlApplicationContext("/spring-context.xml");
UserAction bean = (UserAction) context.getBean("userAction");
// bean.test1();
bean.test3();
}
}
自动装配
default-autowire="byType"
<!-- byName按name去进行自动装配 而 byType则是按照type -->
<bean id="ub" class="com.shl.ioc.impl.UserBizImpl1"></bean>
将spring的上下文交给Tomcat上下文进行管理
为什么spring的上下文要交给Tomcat上下文?
目前工程中所有的javabean都交给了spring进行管理,那么浏览器发送请求,请求的是Tomcat,有Tomcat来处理请求,Tomcat处理请求一般都要访问数据库,数据库是由Dao层访问的,Dao层的实体类又是交给spring的上下文处理的,那就意味着Tomcat要处理请求,必须拿到spring的上下文,才能拿到Dao层的javabean
SpringLoadListener
//监听器
@WebListener
public class SpringLoadListener implements ServletContextListener {
//文件地址
private String springXmlLocation="";
@Override//Servlet重写
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听了tomcat的启动...");
ServletContext servletContext = sce.getServletContext();//获取tomcat上下文
springXmlLocation=servletContext.getInitParameter("springXmlLocation");//获得初始化参数<param-value>/spring-other.xml</param-value>
//如果说web.xml没有配置
if(null==springXmlLocation||"".equals(springXmlLocation)) {
springXmlLocation="/spring-context.xml";
}
System.out.println("springXmlLocation:"+springXmlLocation);
ApplicationContext springContext=new ClassPathXmlApplicationContext(springXmlLocation);//建模
servletContext.setAttribute("SPRING_CONTEXT_KEY", springContext);//spring上下文
}
}
UserServlet
package com.xyx.ioc.test;
import java.io.IOException;
import javax.servlet.ServletContext;
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;
import com.xyx.ioc.web.UserAction;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@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 {
ServletContext servletContext = req.getServletContext();//获取上下文
ApplicationContext springContext=(ApplicationContext) servletContext.getAttribute("SPRING_CONTEXT_KEY");//取SpringLoadListener值
UserAction bean = (UserAction) springContext.getBean("userAction");
bean.test3();
}
}