栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

J2EE基础:Spring及ioc

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

J2EE基础:Spring及ioc

目录

一、Spring的简介

二、Spring中ioc的特点 

1. 统一的路口,一处改变,多处改变,版本抽离出来的一个原因

2.具体的jar包依赖 

 3.导入jdk的插件

4.目录放出来,接着把我们的web2.3改为3.1

 5.把这个maven项目搭建起来

6.更新

​编辑 

二、Spring中ioc的特点 

 三、依赖注入的3中方式

1.set 注入

2.构造 注入 

3.自动装配 

        byName 

        byType 

4.总结  

 default-autowire="byType"

 四、Spring与web容器的整合 

1.why:建模的过程是十分耗时的  

2.解决问题 

1.建模必不可少

2.建模要保障只执行一次

3.3.建模后期望在每一个Servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext 

3.how 

1.监听器的初始化方法

 2.Spring的上下文要存放在Tomcat上下文中

3.还需优化 

 五、总结

1.Spring的作用

2.IOC的作用

3.依赖注入的方式

4.自动装配

5.Spring于web集合    


一、Spring的简介

 Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。

   Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。

   然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

   

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

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

   范围:任何Java应用

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

   1.1 中间层框架、万能胶

       struts2

       spring

       hibernate

   1.2 容器框架

         JavaBean 项目中的一个个类

         IOC和AOP

二、Spring中ioc的特点 

我们先新建一个maven项目

1. 统一的路口,一处改变,多处改变,版本抽离出来的一个原因

2.具体的jar包依赖 

 如果这个文件报红了,下面就不用写了,如果说当前目录解决不了,就切换一个目录,在解决不了,那么就把仓库清空

 3.导入jdk的插件

 

4.目录放出来,接着把我们的web2.3改为3.1

web.xml



  Archetype Created Web Application

 5.把这个maven项目搭建起来

6.更新

二、Spring中ioc的特点 

 

通过上面这些我们目前就只需要修改UserBizImp12即可,项目越大修改的就越多,目前我们只是有两个

 总结:
     最原始:频繁修改业务层biz层代码    反复去修改原有的代码,本来没有bag就会修改成bug
     多实现:凡是涉及到用户业务层 调用的地址,都需要修改代码    修改的就是这个接口的实现类

spring-context .xml




 把这个复制到如图所示:

我们新建一个Demo1测试一下:

 

我们现在运行的UserBizImpl2-----》运行结果如图所: 

 

运行的UserBizImpl2-----》运行结果如图所:  

 三、依赖注入的3中方式

目前我只是把OrderAction的set和get方法注释了如图所示 

 我们在运行一下就会报错

 建模就报错了,就是说没有set方法了,也就是说我们注入对象方法的话它是跟set方法是有关系的

1.set 注入

打印然后我们在去Demo1里面运行一下看看有没有如图所示:

userBiz.java

package com.jwj.biz;


public interface UserBiz {
	
	void list();
	

}

 

 代码块:UserAction.java

package com.jwj.biz.web;

import java.util.List;

import com.jwj.biz.UserBiz;
import com.jwj.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;
	}

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

}

spring-context.xml




	
	
	
	
		
		
		
		
			
				篮球
				rap
				唱跳
			
		
		
	
	
		
	
	

2.构造 注入 

通过构造器 ,我们在OrderAction里面设置如图所示:

我们在去运行一下如图所示:

OrderAction.java代码块:

package com.jwj.biz.web;

import java.util.List;

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

public class OrderAction {
	
//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 OrderAction(String name, int age, List hobby) {
		super();
		this.name = name;
		this.age = age;
		this.hobby = hobby;
	}
	
	public OrderAction() {
		// TODO Auto-generated constructor stub
	}


	public void list() {
		System.out.println(name);
		System.out.println(age);
		System.out.println(hobby);
//		调用业务处理类
		userBiz.list();
	}


}

spring-context.xml




	
	
	
	
	
		
		
		
		
			
				篮球
				rap
				唱跳
			
		
	
	
	
		
		
		
		
		
			
				篮球
				rap
				唱跳
			
		
	
	

3.自动装配 

报空指针错误,因为没有输入所以才会报错 

        byName 

改为这样如图所示: 

我们在去运行一下: 就没有报错了

 我们把UserAction里面的userBiz改为userBiz1,全部改好了之后我们在去运行一下:就会报错如图所示:

 报的错就是我们刚刚改动的地址

        byType 

当我们在换成byType的时候如图所示: 

 

我们在去运行一下就不会报错了如图所示:

  

4.总结  

我们在换回来byName 

 

 当我们有改为byType的时候,它就会报错了如图所示:

 default-autowire="byType"

byName: 是Spring管理的bean对象的ID进行查找 ,如果找不到则注入失败,反之成功。

byType: 是Spring管理的bean对象接口实现类进行查找,如果没有或2个以上,则注入失败,反之成功

 四、Spring与web容器的整合 

 它是为了解决问题的,最终我们的开发肯定是开发web应用的web网页程序,最终就是要运行起来,要拿到整个工程里的任何一个bin对象的,那么我们当前是通过建模的方式去拿的,那么我们不可能把建模的那段代码放到每一个servlet里面去做

1.why:建模的过程是十分耗时的  

项目启动两三分钟少之又少,如果每一次请求都要加这个文件,给客户的响应速度是极其慢的

 如果要走上面那个建模就相当于睡觉了,也就相当于Thread.sleep(10000);

2.解决问题 

建模是耗时间的, 怎么才能让建模执行一次,并且同时能让每一个Servlet拿到context对象?

1.建模必不可少

2.建模要保障只执行一次

3.3.建模后期望在每一个Servlet都能够拿到Spring的上下文对象ClassPathXmlApplicationContext 

3.how 

1.监听器的初始化方法

Tomcat一启动监听器就打印,那么它会保障一定不会给你建模,并且它还保证执行一次

 2.Spring的上下文要存放在Tomcat上下文中

SpringLoadListener.java代码块:

package com.jwj.biz.ioc.listener;

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

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jwj.biz.web.UserAction;

public class SpringLoadListener implements ServletContextListener{

	@Override
	public void contextInitialized(ServletContextEvent sce) {
//		拿到Spring的上下文中
//		建模
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
//		将Spring的上下文保存到Tomcat上下文
		ServletContext servletContext = sce.getServletContext();
		servletContext.setAttribute("springContext", context);
		
	}	

}

 DemoServlet.java代码块:

package com.jwj.biz.ioc.demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jwj.biz.web.UserAction;


@WebServlet("/springDemo")
public class DemoServlet extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
//		Thread.sleep(1000);
//		建模
//		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
		ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
		UserAction userAction = (UserAction) context.getBean("userAction");
		userAction.list();
	}

}

 我们在我们在上面的测试改动一下

把我们之前注册的那两个行代码还原,然后我们有多写了一个UserBiz1那个给注释掉,把id改为原来的UserBiz

spring-context.xml代码块:




	
	
	
	
	
	
		
		
		
		
			
				篮球
				rap
				唱跳
			
		
	
	
	
		
		
		
		
		
			
				篮球
				rap
				唱跳
			
		
	
	

 UserAction.java代码块 把里面的UserBiz1改为UserBIz

package com.jwj.biz.web;

import java.util.List;

import com.jwj.biz.UserBiz;
import com.jwj.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;
	}

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

}

我们要记得去web.xml配置,没有配置的话会报500的错误

 web.xml代码块:



  Archetype Created Web Application
  
  
  	com.jwj.biz.ioc.listener.SpringLoadListener
  

然后我们在运行一下:在DemoServlet记得加上注解@WebServlet("/springDemo")     注意要用debug启动

 

3.还需优化 

 在我们的SpringLoadListener框架里面一定叫ServletContextEvent不一定,我们的框架一定要支持可以更改框架名字的,如果一个项目要用十几个框架的就会重命名,所以一定要支持可配置

我们就要在web.xml里面去配置一下



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

SpringLoadListener.java

在我们的上下文中拿到这个值

package com.jwj.biz.ioc.listener;

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

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jwj.biz.web.UserAction;

public class SpringLoadListener implements ServletContextListener{

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("初始化...");
		
		ServletContext servletContext = sce.getServletContext();
		
//		拿到我们刚刚配置好的
		String springconfiglocation = servletContext.getInitParameter("springconfiglocation");
//		拿到我们的值
		System.out.println(springconfiglocation+".....");
		
//		拿到Spring的上下文中
//		建模
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
//		将Spring的上下文保存到Tomcat上下文
		servletContext.setAttribute("springContext", context);
		
	}	

}

我们在运行一下看看拿到了没有如图所示:拿到了

 五、总结

前四个都是面试题 

1.Spring的理解及作用

        容器框架        中间层框架        用来整合其他的第三方框架

        有两大核心组件        第一个是ioc        第二个是aop

2.IOC的作用

        特点:依赖注入、控制反转

        控制反转:经创建对象的权利,有程序员手动new对象的权利转交给Spring容器完成

        优点:便于维护,拥抱变化

3.依赖注入的方式

        set注入

        构造注入

        自动装配

4.自动装配

        byName:根据bean 的 id在Spring的上下文中进行寻找,匹配上了会自动注入给属性

        byType:根据属性接口在Spring上下文中找对应的接口实现类,如果找到一个,就会自动注入;如果0或者2个以上就会报错

5.Spring如何与web容器集成

1.在监听器中初始化Spring上下文--建模

2.拿到tomcat上下文,将Spring上下文存储到tomcat中

3.在web.xml中配置监听器

4.在测试的servlet中进行测试,在servlet看能否拿到Spring上下文 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036597.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号