什么是控制反转(或依赖注入)
控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中
案例:实现Spring的IoC
IOC/DI
将以前由程序员实例化对象/赋值的工作交给了spring处理
例:
我们再写项目
现在客户对你的一个功能不满意需要升级处理
每次更新后都需要修改与这个功能相关联模块的代码实例化对象
我这里只写了两个模块如果是很多个那么一一修改代码将会很麻烦并且如果更新后出了问题还要改回来更加麻烦
这里我们可以导入spring的一个xml文件(先要再pom.xml导入spring依赖)
//调用上面写好的 //修改时无需修改具体的实体类只需修改它调用上面的UserBiz1路径(无论有多少与更新相关的模块都可以一键修改掉) //调用上面写好的 //修改时无需修改具体的实体类只需修改它调用上面的UserBiz1路径(无论有多少与更新相关的模块都可以一键修改掉)
package com.mjx.web;
import com.mjx.ioc.UserBiz;
import com.mjx.ioc.impl.UserBizImpl;
public class UserAction {
//定义的UserBiz取得名字要和spring-context.xml中一致
private UserBiz userbiz;
public UserBiz getUserbiz() {
return userbiz;
}
public void setUserbiz(UserBiz userbiz) {
this.userbiz = userbiz;
}
private void text() {
userbiz.text();
}
public static void main(String[] args) {
UserAction useraction=new UserAction();
useraction.text();
}
}
这时候我们把实例化更新前后的两个方法由这个文件,提供然后写个getset方法
写个测试类提取spring的一个xml文件中的值
package com.mjx.ioc.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mjx.web.PersonAction;
public class IoC_text {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
PersonAction personaction = (PersonAction) applicationContext.getBean("PersonAction");
personaction.text();
}
}
spring传参
set传参
配置文件内代码
吃饭 睡觉 打豆豆
实体类代码提供get set代码
package com.mjx.web;
import java.util.List;
public class ParamAction {
private String name;
private int age;
private List hoby;
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 getHoby() {
return hoby;
}
public void setHoby(List hoby) {
this.hoby = hoby;
}
public void execute() {
System.out.println(this.name);
System.out.println(this.age);
System.out.println(this.hoby);
}
}
运行效果
构造传参
实体类
package com.mjx.web;
import java.util.List;
public class ParamAction {
private String name;
private int age;
private List hoby;
public ParamAction() {
}
public ParamAction(String name, int age, List hoby) {
super();
this.name = name;
this.age = age;
this.hoby = hoby;
}
public void execute() {
System.out.println(this.name);
System.out.println(this.age);
System.out.println(this.hoby);
}
}
配置文件
吃饭 睡觉 打豆豆
结果
1、监听器:SpringLoaderListener实现 ServletContextListener接口
package com.mjx.ioc.listenner;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringLoaderListenner implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("执行监听器方法");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
sce.getServletContext().setAttribute("SpringContext", applicationContext);
}
}
2、配置监听器
com.mjx.ioc.listenner.SpringLoaderListenner
测试
package com.mjx.ioc.servlet;
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 com.mjx.web.ParamAction;
@WebServlet("/user")
public class UserServlet 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();
}
}
②、结果:监听器只会执行一次,结果可执行多次



