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

Spring之ioc

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

Spring之ioc

一:认识spring 1.什么是spring

介绍:Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂               性而创建的。
           Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
           然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度             而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2.什么是控制反转(或依赖注入) 

介绍:控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的              (依赖)关系,而非传统实现中,由程序代码直接操控。

           这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,

          控制权的转移,是所谓反转。
          IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)”  ,即由容器动态的              将某种依赖关系注入到组件之中 
          案例:实现Spring的IoC

   IOC/DI
     将以前由程序员实例化对象/赋值的工作交给了spring处理

3.如何在spring当中定义和配置一个JavaBean(使用无参构造方法+set方法创建一个JavaBean)

1. id:在容器中查找Bean的id(唯一、且不能以/开头)
2. class:bean的完整类名
3. name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号        或空格隔开)
4. scope:(singleton|prototype)默认是singleton
     1. singleton(单例模式):在每个Spring IoC容器中一个bean定义对应一个对象实例
     2. prototype(原型模式/多例模式):一个bean定义对应多个对象实例
5. abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽      象bean,非抽象类也可以定义成抽象bean
6.parent:指定一个父bean(必须要有继承关系才行)
7. init-method:指定bean的初始化方法
8. constructor-arg:使用有参数构造方法创建javaBean

二:ioc

解决以下两个问题:

1.更新版本需要改动原有代码
2.相关调用此方法的模块伴随着巨大的风险

先创建一个UserBiz接口

package com.sg.ioc.biz;

public interface UserBiz {
	public void upload();
}

再创建两个实现类实现UserBiz接口(UserBizImpl1、UserBizImpl2)

UserBizImpl1

package com.sg.ioc.biz.impl;

import com.sg.ioc.biz.UserBiz;


public class UserBizImpl1 implements UserBiz{
	@Override
	public void upload() {
		// TODO Auto-generated method stub
		System.out.println("lll");
	}
}

UserBizImpl2

package com.sg.ioc.biz.impl;

import com.sg.ioc.biz.UserBiz;


public class UserBizImpl2 implements UserBiz{
	@Override
	public void upload() {
		// TODO Auto-generated method stub
		System.out.println("加限定");
		System.out.println("lll");
	}
}

再创建2个web层(PersonAction、UserAction)

PersonAction

package com.sg.ioc.web;

import com.sg.ioc.biz.UserBiz;
import com.sg.ioc.biz.impl.UserBizImpl1;
import com.sg.ioc.biz.impl.UserBizImpl2;

public class PersonAction {
	private UserBiz userBiz=new UserBizImpl2();
	
	public void upload() {
		userBiz.upload();
	}
	
	public static void main(String[] args) {
		PersonAction personAction=new PersonAction();
		personAction.upload();
	}
}

UserAction

package com.sg.ioc.web;

import com.sg.ioc.biz.UserBiz;
import com.sg.ioc.biz.impl.UserBizImpl1;

public class UserAction {
	private UserBiz userBiz=new UserBizImpl1();
	
	public void upload() {
		userBiz.upload();
	}
	
	public static void main(String[] args) {
		UserAction userAction=new UserAction();
		userAction.upload();
	}
}

结果展示:

UserAction

 PersonAction

 缺陷:如果要加好多个,那么就会建很多的类,特别麻烦

解决方法(使用spring-context.xml配置文件)

导入xml文件(spring-context.xml)

该配置文件配置的是整个项目中包含的所有的javabean

目的:统一管理






新建实体类(IocTest )

package com.sg.ioc.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sg.ioc.web.PersonAction;

public class IocTest {
	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-context.xml");
		PersonAction personAction = (PersonAction)applicationContext.getBean("personAction");
		personAction.upload();
	}
}

写配置







	



结果展示:

 如果我要更改配置,只需要更改ref就可以了,这样就解决了很多麻烦

 把ref改为userBiz1

三:spring传参

给javabean赋初始化值  传参

传参的三种方式:
1.set传参

第一步: 新建实体类(ParamAction)

package com.sg.ioc.web;

import java.util.List;

public class ParamAction {
	private int age;
	private String name;
	private List hobby;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List getHobby() {
		return hobby;
	}
	public void setHobby(List hobby) {
		this.hobby = hobby;
	}
	public void execute() {
		System.out.println(this.name);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}
}

第二步:新增配置







	


	


	


	


	
	
	
		
			 按摩
			 足浴
			 大保健
		
	


第三步:调用方法

package com.sg.ioc.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sg.ioc.web.ParamAction;
import com.sg.ioc.web.PersonAction;
import com.sg.ioc.web.UserAction;
import com.sg.ioc.web.UserAction2;
import com.sg.ioc.web.UserAction3;

public class IocTest {
	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-context.xml");
//		PersonAction personAction = (PersonAction)applicationContext.getBean("personAction");
//		personAction.upload();
		
//		UserAction userAction = (UserAction)applicationContext.getBean("userAction");
//		userAction.upload();
//		UserAction2 userAction1 = (UserAction2)applicationContext.getBean("userAction2");
//		userAction1.upload();
//		UserAction3 userAction2 = (UserAction3)applicationContext.getBean("userAction3");
//		userAction2.upload();
		
		ParamAction paramAction = (ParamAction)applicationContext.getBean("paramAction");
		paramAction.execute();
	}
}

结果展示:


2.构造传参

 第一步:写构造方法

package com.sg.ioc.web;

import java.util.List;

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

	public void execute() {
		System.out.println(this.name);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}
}

第二步:更改配置







	


	


	


	


	
	
	
	
		
			 按摩
			 足浴
			 大保健
		
	


第三步:调用方法

package com.sg.ioc.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sg.ioc.web.ParamAction;
import com.sg.ioc.web.PersonAction;
import com.sg.ioc.web.UserAction;
import com.sg.ioc.web.UserAction2;
import com.sg.ioc.web.UserAction3;

public class IocTest {
	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-context.xml");
//		PersonAction personAction = (PersonAction)applicationContext.getBean("personAction");
//		personAction.upload();
		
//		UserAction userAction = (UserAction)applicationContext.getBean("userAction");
//		userAction.upload();
//		UserAction2 userAction1 = (UserAction2)applicationContext.getBean("userAction2");
//		userAction1.upload();
//		UserAction3 userAction2 = (UserAction3)applicationContext.getBean("userAction3");
//		userAction2.upload();
		
		ParamAction paramAction = (ParamAction)applicationContext.getBean("paramAction");
		paramAction.execute();
	}
}

结果展示:


3.自动装配(基本不用)

四:spring与tomcat整合

问题:如果按照上面方法进行建模,那么当足够多的时候那个,建模的时间也会越来越久,效率也就低了,影响性能

解决方法:使用监听器

第一步:新建一个监听器(SpringLoaderListener)

package com.sg.ioc.listener;

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

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringLoaderListener implements ServletContextListener{
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("监听器方法执行");
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-context.xml");
		sce.getServletContext().setAttribute("SpringContext", applicationContext);
	}
}

第二步:在web.xml中配置监听器


  Archetype Created Web Application
  
  	com.sg.ioc.listener.SpringLoaderListener
  

第三步:新建servlet()

package com.sg.ioc.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;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@WebServlet("/user")
public class UserServlt extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ApplicationContext springContext = (ApplicationContext)req.getServletContext().getAttribute("SpringContext");
		ParamAction paramAction = (ParamAction)springContext.getBean("paramAction");
		paramAction.execute();
	}
}

结果展示:

这个时候再运行一次

 

监听器还是只运行了一次 

拜拜了各位!!!!!

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

版权所有 (c)2021-2022 MSHXW.COM

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