2.什么是控制反转(或依赖注入)介绍:Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂 性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度 而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
3.如何在spring当中定义和配置一个JavaBean(使用无参构造方法+set方法创建一个JavaBean)介绍:控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的 (依赖)关系,而非传统实现中,由程序代码直接操控。
这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,
控制权的转移,是所谓反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的 将某种依赖关系注入到组件之中
案例:实现Spring的IoCIOC/DI
将以前由程序员实例化对象/赋值的工作交给了spring处理
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
三:spring传参解决以下两个问题:
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与tomcat整合给javabean赋初始化值 传参
传参的三种方式:
1.set传参第一步: 新建实体类(ParamAction)
package com.sg.ioc.web; import java.util.List; public class ParamAction { private int age; private String name; private Listhobby; 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 Listhobby; 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.自动装配(基本不用)
问题:如果按照上面方法进行建模,那么当足够多的时候那个,建模的时间也会越来越久,效率也就低了,影响性能
解决方法:使用监听器
第一步:新建一个监听器(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(); } }结果展示:
这个时候再运行一次
监听器还是只运行了一次
拜拜了各位!!!!!



