• Spring入门


    目录

    一、Spring的概念

    二、Spring ioc 的特点

    三、Spring与web容器的整合原理


    一、Spring的概念

    Spring是一个开源的控制反转(ioc)和面向切面(Aop)的容器框架

    能够整合其他的第三方框架

    二、Spring ioc 的特点

    IOC的主要作用项目管理JavaBean,依靠依赖注入和控制反转进行管理

    1、控制反转

    将创建对象的权力由程序员new对象反转给Spring容器来完成

    在Spring的xml文件中进行配置

    1. <bean class="com.zjy.biz.impl.UserBizImpl2" id="userBiz">bean>
    2. <bean class="com.zjy.web.UserAction" id="userAction">
    3. <property name="userBiz" ref="userBiz">property>
    4. <bean>
    5. <bean class="com.zjy.web.OrderAction" id="OrderAction">
    6. <property name="userBiz" ref="userBiz">property>
    7. <bean>

    在案例1中对Spring的xml文件进行建模,建模之后所有的javabean对象都能够加载进Spring容器中的上下文

    1. public class Demo1 {
    2. @SuppressWarnings("resource")
    3. public static void main(String[] args) {
    4. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
    5. UserAction userAction = (UserAction) context.getBean("userAction");
    6. userAction.list();
    7. OrderAction orderAction = (OrderAction) context.getBean("userAction");
    8. orderAction.list();
    9. }

    2、依赖注入

    依赖注入分为三类:set注入、构造注入和自动装配

    2.1 set注入:在业务类中设置属性的set和get方法

    1. private UserBiz userBiz;
    2. public UserBiz getUserBiz() {
    3. return userBiz;
    4. }
    5. public void setUserBiz(UserBiz userBiz) {
    6. this.userBiz = userBiz;
    7. }
    8. private String name;
    9. private int age;
    10. private List<String> hobby;
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. public List<String> getHobby() {
    24. return hobby;
    25. }
    26. public void setHobby(List<String> hobby) {
    27. this.hobby = hobby;
    28. }

    在xml文件中配置

    1. <bean class="com.zjy.web.UserAction" id="userAction">
    2. <property name="userBiz" ref="userBiz">property>
    3. <property name="name" value="zjy">property>
    4. <property name="age" value="22">property>
    5. <property name="hobby" >
    6. <list>
    7. <value>singvalue>
    8. <value>dancevalue>
    9. <value>basketballvalue>
    10. list>
    11. property>
    12. bean>

    2.2构造注入:在业务类中获取属性的构造方法

    1. public UserBiz getUserBiz() {
    2. return userBiz;
    3. }
    4. public void setUserBiz(UserBiz userBiz) {
    5. this.userBiz = userBiz;
    6. }
    7. private String name;
    8. private int age;
    9. private List<String> hobby;
    10. public OrderAction() {
    11. // TODO Auto-generated constructor stub
    12. }
    13. public OrderAction(String name, int age, List<String> hobby) {
    14. super();
    15. this.name = name;
    16. this.age = age;
    17. this.hobby = hobby;
    18. }

    在xml文件中配置

    1. <bean class="com.zjy.web.OrderAction" id="OrderAction">
    2. <property name="userBiz" ref="userBiz">property>
    3. <constructor-arg name="name" value="xiaozhu">constructor-arg>
    4. <constructor-arg name="age" value="24">constructor-arg>
    5. <constructor-arg name="hobby" >
    6. <list>
    7. <value>singvalue>
    8. <value>dancevalue>
    9. <value>basketballvalue>
    10. list>
    11. constructor-arg>
    12. bean>

    2.3自动装配:byType、byName

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

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

    三、Spring与web容器的整合原理

    1、为什么要进行整合

    在未整合之前我们都是通过建模拿到Spring容器的上下文,但是建模十分耗时,并且项目庞大的话我们需要进行多次建模,就更加耗时

    2、整合所需要解决的问题

    2.1 建模必不可少

    2.2 建模要保证只执行一次

    2.3建模后期再每一个Servlet都能够拿到Spring上下文对象ClasspathXmlApplication

    3、如何解决

    3.1.监听器的初始化方法
     3. 2.Spring的上下文要存放在tomcat上下文中

    Spring的监听类

    1. package com.zjy.ioc.listener;
    2. import javax.servlet.ServletContext;
    3. import javax.servlet.ServletContextEvent;
    4. import javax.servlet.ServletContextListener;
    5. import org.springframework.context.support.ClassPathXmlApplicationContext;
    6. import com.zjy.web.UserAction;
    7. public class SpringLoadListener implements ServletContextListener{
    8. @Override
    9. public void contextInitialized(ServletContextEvent sce) {
    10. //拿到Spring的上下文
    11. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
    12. //将Spring的上下文保存到tomcat上下文中
    13. ServletContext servletContext = sce.getServletContext();
    14. servletContext.setAttribute("springContext",context );
    15. }
    16. }

    Servlet方法 

    1. @WebServlet("/springDemo")
    2. public class DemoServlet extends HttpServlet{
    3. @Override
    4. protected void service(HttpServletRequest req, HttpServletResponse rep) throws ServletException, IOException {
    5. ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
    6. UserAction userAction = (UserAction) context.getBean("userAction");
    7. userAction.list();
    8. }

    运行结果

    4、优化监听器 

    目前在我们的监听器类中框架文件的名字是定死的,我们需要使我们的框架文件名支持可更改

     如何优化:在web.xml文件中使用全局变量

    1. <context-param>
    2. <param-name>springConfigLocationparam-name>
    3. <param-value>/applicationContext.xmlparam-value>
    4. context-param>
    1. public class SpringLoadListener implements ServletContextListener{
    2. @Override
    3. public void contextInitialized(ServletContextEvent sce) {
    4. //拿到Spring的上下文
    5. ServletContext servletContext = sce.getServletContext();
    6. String springConfigLocation = servletContext.getInitParameter("springConfigLocation");
    7. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
    8. //将Spring的上下文保存到tomcat上下文中
    9. servletContext.setAttribute("springContext",context );
    10. }

  • 相关阅读:
    算法与设计分析--实验一
    基于人工水母优化的BP神经网络(分类应用) - 附代码
    《位图BitMap - 基于java实现》
    【更新!】3dMax材质ID随机生成器插件MaterialIDsRandomGenerator v2.1.2使用教程
    每日一题 322零钱兑换(完全背包)(灵神版本)
    基于51单片机智能手机锂电池充电器设计
    含文档+PPT+源码等]精品基于SSM的物流管理系统[包运行成功]Java毕业设计SSM项目源码快递管理系统
    力扣每日一题:754. 到达终点数字【数学题】
    manimgl入门
    【Python】pytorch,CUDA是否可用,查看显卡显存剩余容量
  • 原文地址:https://blog.csdn.net/m0_67477525/article/details/126180209