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();
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值