1.Spring简介:
Spring是一个开源的Java应用程序框架,它可以用于开发各种类型的应用程序,包括Web应用程序、企业级应用程序、移动应用程序等。Spring框架提供了丰富的功能和特性,例如依赖注入(DI)控制反转和面向切面编程(AOP),它还可以轻松地与其他开源框架和技术集成。Spring框架主要目的是简化应用程序的开发,提高开发的效率,同时降低应用程序的复杂度和维护成本。
简单的来说他就是一个轻量级.控制反转和面向切面的容器框架;
2.Spring的注入方式:
Spring的注入方式有三种:构造器注入、Setter方法注入和字段注入。
1.构造器注入:通过构造方法将依赖注入到目标对象中。
2.Setter方法注入:通过Setter方法将依赖注入到目标对象中。
3.字段注入:通过反射机制将依赖注入到目标对象的字段中。
其中,构造器注入和Setter方法注入是比较常用的方式,因为它们可以保证依赖注入的顺序,同时也可以将依赖注入到私有字段中。而字段注入可能会导致依赖注入的顺序不确定,并且无法将依赖注入到私有字段中,因此不太常用。
3.Spring与web容器的整合原理
Spring与web容器(如Tomcat、Jetty等)的整合原理如下:
1. 首先在web.xml文件中声明Spring的DispatcherServlet和ContextLoaderListener。
2. DispatcherServlet是一个前端控制器,用于处理所有的客户端请求,并将它们转发到相应的处理器(Controller)进行处理。它主要负责处理HTTP请求和响应。
3. ContextLoaderListener是一个监听器,用于在web应用程序启动时加载Spring配置文件,并创建Spring应用程序上下文。它主要负责管理Spring应用程序上下文,包括IoC容器、Bean的生命周期等。
4. Spring应用程序上下文是一个IoC容器,负责管理Spring的Bean及其依赖关系。在Web应用程序中,Spring应用程序上下文通常被称为Web应用程序上下文。
5. 当web容器接收到客户端请求时,先经过web服务器的处理,然后将请求传递给DispatcherServlet。
6. DispatcherServlet将请求交给HandlerMapping进行处理,根据请求的URL找到相应的处理器(Controller)。
7. 处理器(Controller)负责处理请求,并调用相应的Service进行业务逻辑处理。
8. Service类中通常会使用Spring注解(如@Autowired)来注入其他Bean,以此实现依赖注入(DI)。
9. 处理器(Controller)将处理结果封装为ModelAndView对象,并将其返回给DispatcherServlet。
10. DispatcherServlet将ModelAndView对象传递给ViewResolver,ViewResolver通过视图名称找到相应的视图并返回。
11. 最后,DispatcherServlet将视图返回给客户端,完成请求处理过程。
4.ioc控制反转
Ioc(Inversion of Control)控制反转,是一种设计模式,其主要思想是将对象的创建和依赖关系的管理交给容器来完成。在Ioc中,容器负责创建对象,管理对象之间的关系以及依赖注入。
Spring框架的Ioc实现是基于依赖注入(DI)的,DI通过反射和注解等机制,将对象之间的依赖关系动态传递给它们,使得对象的创建和依赖管理不再由程序员手动完成。在Spring中,容器负责管理Bean的生命周期和依赖注入。
Spring的Ioc容器是一个框架,封装了对象的创建和依赖关系的管理。它提供了许多功能,如Bean的管理、依赖注入、AOP等,使得开发者可以更加专注于业务逻辑的实现。
spring-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="com.zhnaghao.web.UserAction" id="userAction" > <property name="userService" ref="userService"></property> </bean> <bean class="com.zhanghao.web.GoodsAction" id="goodsAction" > <property name="userService" ref="userService2"></property> </bean> <bean class="com.zhanghao.service.impl.UserServiceimpl1" id="userService"></bean> <bean class="com.zhanghao.service.impl.UserServiceimpl" id="userService2"></bean> </beans>
UserService
package com.zhanghao.service; public interface UserService { public void update(); }
UserAction
package com.zhanghao.web; import com.zhanghao.service.UserService; public class UserAction { private UserService userService; public String update(){ userService.update(); return "list"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } }
GoodsAction
package com.zhanghao.web; import com.zhanghao.service.UserService; public class UserAction { private UserService userService; public String update(){ userService.update(); return "list"; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } }
测试类
package com.zhagnhao.text; import com.zhagnhao.web.GoodsAction; import com.zhagnhao.web.UserAction; import org.springframework.context.support.ClassPathXmlApplicationContext; public class demo1 { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml"); UserAction userAction = (UserAction) context.getBean("userAction"); userAction.update(); GoodsAction goodsAction = (GoodsAction) context.getBean("goodsAction"); goodsAction.update(); } }
Set注入
package com.zhanghao.ioc.web; import com.zhanghao.ioc.service.UserService; import java.util.List; public class GoodsAction { /** * 例如:在不同的控制器中进行方法调用 */ private UserService userService; private String gname;//名称 private int age;//保质期 private List<String> peoples;//使用人群 public String getGname() { return gname; } public void setGname(String gname) { this.gname = gname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<String> getPeoples() { return peoples; } public void setPeoples(List<String> peoples) { this.peoples = peoples; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public void pop(){ System.out.println("名称:"+this.gname); System.out.println("保证期:"+this.age); System.out.println("使用人群:"+this.peoples); } public String update(){ userService.update(); return "list"; } }
构造方法
package com.zhanghao.ioc.web; import com.zhanghao.ioc.service.UserService; import java.util.List; public class UserAction { private UserService userService ; private String uname;//姓名 private int age;//年龄 private List<String> hobby;//爱好 public UserAction() { } public UserAction(String uname, int age, List<String> hobby) { this.uname = uname; this.age = age; this.hobby = hobby; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public void pop(){ System.out.println("名字为:"+this.uname); System.out.println("年龄为:"+this.age); System.out.println("爱好为:"+this.hobby); } public String update(){ userService.update(); return "list"; } }
接口注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" default-autowire="byName" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="com.CloudJun.ioc.web.UserAction" id="userAction"> <property name="userService" ref="userService"></property> <constructor-arg name="uname" value="刘文" ></constructor-arg> <constructor-arg name="age" value="18" ></constructor-arg> <constructor-arg name="hobby" > <list> <value>看妹子</value> <value>看妹子</value> </list> </constructor-arg> </bean> <bean class="com.CloudJun.ioc.web.GoodsAction" id="goodsAction"> <property name="userService" ref="userServiceImpl2"></property> <property name="gname" value="给我死"></property> <property name="age" value="2"></property> <property name="peoples"> <list> <value>小明</value> <value>小麦</value> <value>小米</value> </list> </property> </bean> <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl" id="userService" ></bean> <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean> </beans>
配置servlet
package com.xiaoxu.servlet; import com.xiaoxu.service.UserService; import org.springframework.context.support.ClassPathXmlApplicationContext; 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 java.io.IOException; @WebServlet("/userList") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取spring上下文对象 ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext"); UserService userService = (UserService) context.getBean("userService"); userService.update(); System.out.println(userService); } }
配置监听器
package com.xiaoxu.listeer; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener("") public class SpringLoadListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { //将spring上下文放入Tomcat上下文 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml"); //获取Tomcat上下文 ServletContext servletContext = sce.getServletContext(); servletContext.setAttribute("springContext",context); } }