Spring(ioc)

目录

一、Spring

二、Spring中ioc的特点

三、依赖注入的3种方式

 1.set注入

 2.构造注入

 3.自动装配

       3.3.1 byName

       3.3.2 byType

四、Spring与web容器的整合


一、Spring

 Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
   Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
   然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

目的:解决企业应用开发的复杂性

功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

范围:任何的Java应用

简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

二、Spring中ioc的特点

先建立一个maven项目将以下代码加入到maven项目中的pom.xml中

	
		5.0.1.RELEASE
		4.0.0
		4.12
	

 Spring(ioc)_第1张图片

加入改代码块的是为了将当前项目jar依赖版本定义在外部,目的在于所有jar包版本进行统一管理 

再将 以下代码块加入其中,替换掉原来标签中的


			junit
			junit
			3.8.1
			test
		
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-aspects
			${spring.version}
		
		
		
			junit
			junit
			${junit.version}
			test
		
		
		
			javax.servlet
			javax.servlet-api
			${javax.servlet.version}
			provided
		

Spring(ioc)_第2张图片 

 后面的步骤和昨天配置的步骤一样,可以前往配置maven

 在开发的时候,往往有这样的场景,有这样一个接口,里面放置的方法为增删改查等;需求:同时在用户模块、订单模块拿到所有的用户数据,并且要求用户数据是已经通过年龄排序了的,然而根据之前所学的对应策略:修改userBiz(业务层)中的方法,添加排序功能。但如果需求又发生改变呢?就可以想到多实现的方法。

可以总结一下:

最原始:频繁修改业务层biz层代码,这样bug容易很多。

多实现:凡是涉及到用户业务层调用的地方,都需要修改代码

将以下xml文件加入到src/main/resources中





Spring(ioc)_第3张图片

 UserAction:

package com.mgy.web;

import com.mgy.biz.UserBiz;
import com.mgy.biz.impl.UserBizImpl1;

public class UserAction {
//	private UserBiz userBiz=new UserBizImpl1();
	private UserBiz userBiz;
	
	
	public UserBiz getUserBiz() {
		return userBiz;
	}


	public void setUserBiz(UserBiz userBiz) {
		this.userBiz = userBiz;
	}


	public void list() {
		userBiz.list();
	}
}

该类和OrederAction一样的代码 

 将之前写的业务层和web加入到之中进行配置,切记要联网





	
	
		
	
	
		
	

Demo1:

package com.mgy.demo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mgy.web.OrederAction;
import com.mgy.web.UserAction;

/**
 * 1.对Spring框架的配置晚间进行建模,建模之后,spring-context.xml中所有的Javabean信息都会加载进Spring容器的上下文中
 * 2.上下文中就包含spring-context.xml 所有对象
 * @author Administrator
 *
 *	IOC的特点-什么叫控制反转
 *	指的是将创建对象的权力反转给Spring容器来完成
 *
 */
public class Demo1 {
	public static void main(String[] args) {
		//建模
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
		UserAction userAction = (UserAction) context.getBean("userAction");
		userAction.list();
		
		OrederAction orederAction=(OrederAction)context.getBean("orederAction");
		orederAction.list();
	}
}

 效果:

Spring(ioc)_第4张图片

 之后就只需要修改spring-context.xml文件的中的第一行就可以了。

三、依赖注入的3种方式

将其中一个action中的get和set方法注销后会产生报错

Spring(ioc)_第5张图片

 错误:

Spring(ioc)_第6张图片

 1.set注入

将其中一个action类加入字段,并且给set和get方法

package com.mgy.web;

import java.util.List;

import com.mgy.biz.UserBiz;
import com.mgy.biz.impl.UserBizImpl1;

/**
 * 依赖注入的3种方式:
 * 1.set注入
 * 2.构造注入
 * 3.自动装配
 * @author Administrator
 *
 */
public class UserAction {
//	private UserBiz userBiz=new UserBizImpl1();
	private UserBiz userBiz;
	
	
	public UserBiz getUserBiz() {
		return userBiz;
	}


	public void setUserBiz(UserBiz userBiz) {
		this.userBiz = userBiz;
	}
	
	
	private String name;
	private int age;
	private List hobby;
	
	

	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	public List getHobby() {
		return hobby;
	}


	public void setHobby(List hobby) {
		this.hobby = hobby;
	}


	public void list() {
		System.out.println(name);
		System.out.println(age);
		System.out.println(hobby);
		userBiz.list();
	}
}

在去xml种进行配置




	
	
		
		
		
		
			
				篮球
				boy
				rap
			
		
	
	
		
	

property该标签没有list这个属性,所以要在该标签内部进行

效果图:

Spring(ioc)_第7张图片 

 2.构造注入

将字段给入构造方法,切记要给入无参的构造方法

package com.mgy.web;

import java.util.List;

import com.mgy.biz.UserBiz;
import com.mgy.biz.impl.UserBizImpl1;

public class OrederAction {
//	private UserBiz userBiz=new UserBizImpl1();
	private UserBiz userBiz;
	
	
	public UserBiz getUserBiz() {
		return userBiz;
	}


	public void setUserBiz(UserBiz userBiz) {
		this.userBiz = userBiz;
	}

	private String name;
	private int age;
	private List hobby;
	
	public OrederAction() {
		// TODO Auto-generated constructor stub
	}
	public OrederAction(String name, int age, List hobby) {
		super();
		this.name = name;
		this.age = age;
		this.hobby = hobby;
	}


	public void list() {
		System.out.println(name);
		System.out.println(age);
		System.out.println(hobby);
		userBiz.list();
	}
}

xml文件中的配置,构建注入配置和set注入的配置是不一样的

	
	
		
		
		
		
			
				篮球
				boy
				rap
			
		
	

效果:

 Spring(ioc)_第8张图片

 3.自动装配

       3.3.1 byName

        根据spring中的id进行查询的,如果找不到则出现报错,反之成功

        xml文件:




	
	
	
		
		
		
		
			
				篮球
				boy
				rap
			
		
	
	
	
		
		
		
		
			
				篮球
				boy
				rap
			
		
	

效果:

Spring(ioc)_第9张图片  

       3.3.2 byType

         根据spring中的bean对象接口实现类进行查询的,如果找不到或出现两个则出现报错,反之成功

        将上面的byName给成byType就可以了

Spring(ioc)_第10张图片

四、Spring与web容器的整合

Spring与web容器的整合原理
why:建模的过程十分耗时的
how:
解决问题:
1.建模比不可少
2.建模要保障只执行一次
3.建模后期望在每一个servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext
how:
1.监听器(里面初始化只执行一次)
2.Spring的上下文要存放在Tomcat上下文中
 

package com.mgy.biz.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mgy.web.UserAction;

/**
 * 1.实现监听器
 * 2.初始化方法contextInitialized
 * 3.拿到Tomcat上下文
 * 2.将Spring上下文保存到Tomcat上下文中
 * 
 * @author Administrator
 *
 */
public class SpringLoadListener implements ServletContextListener{

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("初始化");
		ServletContext servletContext = sce.getServletContext();
		//自定义配置文件
		String aa = servletContext.getInitParameter("applicationContext.xml");
		System.out.println(aa+"///拿到了自定义配置文件");
		//拿到Spring上下文(包含所有javabean)
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
		//将Spring上下文保存到Tomcat上下文中
		//applicationContext.xml
		servletContext.setAttribute("springContext", context);
		
	}
	
}

然后我们配置到web服务器上,顺便把定义项目名也配置了 


  Archetype Created Web Application
	
  
  	springconfiglocation
 	/applicationContext.xml
  
	
  
  	com.xlb.biz.ioc.listener.SpringLoadListener
  
	


然后我们写一个实现类web层DemoServlet.java 

package com.mgy.demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mgy.web.UserAction;

/**
 * Spring与web容器的整合原理
 * why:建模的过程十分耗时的
 * how:
 * 	  解决问题:
 * 		1.建模比不可少
 * 		2.建模要保障只执行一次
 * 		3.建模后期望在每一个servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext
 *
 *	how:
 *	  1.监听器(里面初始化只执行一次)
 *	  2.Spring的上下文要存放在Tomcat上下文中
 *    
 * @author Administrator
 *
 */
@WebServlet("/springDemo")
public class DemoServlet extends HttpServlet{

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		//建模
		//1、spring-context.xml模型对象
		//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
		ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext)req.getServletContext().getAttribute("springContext");
		//拿到UserAction
		UserAction userAction = (UserAction)context.getBean("userAction");
		//调用方法
		userAction.list();
	}
	
}

你可能感兴趣的:(spring,java,mybatis)