zoukankan      html  css  js  c++  java
  • 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)”  ,即由容器动态的将某种依赖关系注入到组件之中
       
     IOC/DI
       将以前由程序员实例化对象/赋值的工作交给了spring处理

    3. 如何在spring当中定义和配置一个JavaBean

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

     代码演示

      1、ioc中的注入方式

        导入spring需要的pom依赖

     1 <project xmlns="http://maven.apache.org/POM/4.0.0"
     2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5     <groupId>com.yuan</groupId>
     6     <artifactId>T226_Spring</artifactId>
     7     <packaging>war</packaging>
     8     <version>0.0.1-SNAPSHOT</version>
     9     <name>T226_Spring Maven Webapp</name>
    10     <url>http://maven.apache.org</url>
    11     <dependencies>
    12         <dependency>
    13             <groupId>junit</groupId>
    14             <artifactId>junit</artifactId>
    15             <version>4.12</version>
    16             <scope>test</scope>
    17         </dependency>
    18 
    19         <dependency>
    20             <groupId>mysql</groupId>
    21             <artifactId>mysql-connector-java</artifactId>
    22             <version>5.1.44</version>
    23         </dependency>
    24 
    25         <dependency>
    26             <groupId>javax.servlet</groupId>
    27             <artifactId>javax.servlet-api</artifactId>
    28             <version>4.0.1</version>
    29             <scope>provided</scope>
    30         </dependency>
    31         <dependency>
    32             <groupId>org.springframework</groupId>
    33             <artifactId>spring-context</artifactId>
    34             <version>4.3.10.RELEASE</version>
    35         </dependency>
    36 
    37     </dependencies>
    38     <build>
    39         <finalName>T226_Spring</finalName>
    40         <plugins>
    41             <plugin>
    42                 <groupId>org.apache.maven.plugins</groupId>
    43                 <artifactId>maven-compiler-plugin</artifactId>
    44                 <version>3.7.0</version>
    45                 <configuration>
    46                     <source>1.8</source>
    47                     <target>1.8</target>
    48                     <encoding>UTF-8</encoding>
    49                 </configuration>
    50             </plugin>
    51         </plugins>
    52     </build>
    53 </project>

     1. 2、spring-context.xml配置

       注:这里需要安装一个spring插件,也可以不安装,因为我是没有安装的,所以不能介绍给大家,如果有需要的话可以百度查看安装教程

      其实只需要在xml文件中插入一下代码就欧克了!

     1 <beans xmlns="http://www.springframework.org/schema/beans"
     2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:tx="http://www.springframework.org/schema/tx"
     6     xmlns:aop="http://www.springframework.org/schema/aop"
     7     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
     8        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     9        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    10        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    11 </beans>

     接下来看一下xml的配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     default-autowire="byName"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xmlns:tx="http://www.springframework.org/schema/tx"
     7     xmlns:aop="http://www.springframework.org/schema/aop"
     8     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
     9        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    10        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    11        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    12     <bean class="com.yuan.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
    13     <bean class="com.yuan.ioc.web.UserAction" id="yyy">
    14       <!-- set注入用property标签 -->
    15       <!-- <property name="userBiz" ref="userBiz"></property> -->
    16       <!-- <property name="uname" value="zs"></property>
    17       <property name="age" value="19"></property> -->
    18       <!-- 构造注入用constructor-arg标签 -->
    19       <constructor-arg name="uname" value="ls"></constructor-arg>
    20       <constructor-arg name="age" value="19"></constructor-arg>
    21       <property name="hobby">
    22         <list>
    23           <value>游戏</value>
    24           <value>听歌</value>
    25           <value>篮球</value>
    26         </list>
    27       </property>
    28     </bean>
    29     
    30     
    31     <bean class="com.yuan.ioc.web.OrderAction" id="xxx">
    32       <!-- <property name="userBiz" ref="userBiz"></property> -->
    33     </bean>
    34     
    35 
    36 </beans>

    1.3、写一个接口

     1 package com.yuan.ioc.biz;
     2 
     3 /**
     4  * 通过企业的案例来讲解使用spring--ioc的必要性
     5  * v1.0 :实现游戏中的上传功能
     6  * v2.0 :对游戏的上传功能进行优化
     7  * 
     8  * ioc的具体体现
     9  * @authorly
    10  *
    11  */
    12 public interface UserBiz {
    13 
    14     public void upload();
    15     
    16 }

      写两个类实现上面的接口

      UserBizImpl1

     1 package com.yuan.ioc.biz.impl;
     2 
     3 import com.yuan.ioc.biz.UserBiz;
     4 
     5 public class UserBizImpl1 implements UserBiz {
     6 
     7     @Override
     8     public void upload() {
     9         System.out.println("实现用户上传的功能");
    10         
    11     }
    12 
    13     
    14 }

    UserBizImpl2

     1 package com.yuan.ioc.biz.impl;
     2 
     3 import com.yuan.ioc.biz.UserBiz;
     4 
     5 public class UserBizImpl2 implements UserBiz {
     6 
     7     @Override
     8     public void upload() {
     9         System.out.println("开始优化性能的代码");
    10         System.out.println("实现用户上传的功能");
    11         
    12     }
    13 
    14     
    15 }

       实体类  UserAction

     1 package com.yuan.ioc.web;
     2 
     3 import java.util.List;
     4 
     5 import com.yuan.ioc.biz.UserBiz;
     6 
     7 /**
     8  * IOC的注入方式及各类类型
     9  *  set注入:
    10  *       基本类型与String  属性uname
    11  *       数组  List<String> hobby
    12  *       自定义类型  userBiz 
    13  *  
    14  *  构造注入
    15  *  自动装配
    16  *      spring4之后出现的
    17  *      byType  根据配置的Bean中的接口,在spring的上下文 
    18  *      byName  根据配置的Bean中的接口名字,在spring的上下文
    19  * 
    20  * 
    21  * @author ly
    22  *
    23  */
    24 public class UserAction {
    25 
    26     private UserBiz userBiz;
    27     private String uname;
    28     private int age;
    29     private List<String> hobby;
    30     
    31     
    32 
    33     public UserAction(String uname, int age) {
    34         super();
    35         this.uname = uname;
    36         this.age = age;
    37     }
    38 
    39     public UserAction() {
    40         super();
    41     }
    42 
    43     public List<String> getHobby() {
    44         return hobby;
    45     }
    46 
    47     public void setHobby(List<String> hobby) {
    48         this.hobby = hobby;
    49     }
    50 
    51     public UserBiz getUserBiz() {
    52         return userBiz;
    53     }
    54 
    55     public void setUserBiz(UserBiz userBiz) {
    56         this.userBiz = userBiz;
    57     }
    58 
    59     public void upload() {
    60         userBiz.upload();
    61     }
    62     
    63     /**
    64      * 注入问题
    65      */
    66     public void test1() {
    67         System.out.println(this.uname);
    68         System.out.println(this.age);
    69         System.out.println(this.hobby);
    70     }
    71     
    72 }

      实体类  OrderAction

     1 package com.yuan.ioc.web;
     2 
     3 import com.yuan.ioc.biz.UserBiz;
     4 
     5 public class OrderAction {
     6 
     7     private UserBiz userBiz;
     8     
     9     public UserBiz getUserBiz() {
    10         return userBiz;
    11     }
    12 
    13     public void setUserBiz(UserBiz userBiz) {
    14         this.userBiz = userBiz;
    15     }
    16 
    17     public void upload() {
    18         userBiz.upload();
    19     }
    20     
    21     
    22 }

       测试类  IocTest

     1 package com.yuan.ioc.test;
     2 
     3 import org.springframework.context.ApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 import com.yuan.ioc.web.OrderAction;
     7 import com.yuan.ioc.web.UserAction;
     8 
     9 public class IocTest {
    10 
    11     public static void main(String[] args) {
    12 
    13         UserAction userAction = new UserAction();
    14         userAction.upload();
    15         
    16     ApplicationContext springContext = new ClassPathXmlApplicationContext("/spring-context.xml");
    17         UserAction userAction = (UserAction) springContext.getBean("yyy");
    18         OrderAction orderAction = (OrderAction) springContext.getBean("xxx");
    19         userAction.upload();
    20         orderAction.upload();
    21         userAction.test1();
    22         
    23     }
    24 
    25 }

        改变spring-context.xml中的配置

    <bean class="com.yuan.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>

      set注入:

     *       基本类型与String  属性uname
     *       数组  List<String> hobby
     *       自定义类型  userBiz

     自动装配:

            spring4之后出现的
     *      byType  根据配置的Bean中的接口,在spring的上下文
     *      byName  根据配置的Bean中的接口名字,在spring的上下文

      自动装配只需要更改是spring-context.xml中的default-autowire="byName"或者default-autowire="byType",然后再依次尝试更改bean中的class和id的值

     2、spring管理整个工程中的JavaBean

     2.1 创建一个监听器  SpringLoaderListenter

     1 package com.yuan.ioc.listener;
     2 
     3 import javax.servlet.ServletContext;
     4 import javax.servlet.ServletContextEvent;
     5 import javax.servlet.ServletContextListener;
     6 import javax.servlet.annotation.WebListener;
     7 
     8 import org.springframework.context.ApplicationContext;
     9 import org.springframework.context.support.ClassPathXmlApplicationContext;
    10 
    11 
    12 /**
    13  * spring 作为管理整个工程中的所有的JavaBean,
    14  *  那么如何在用户发送请求的时候能够访问到指定的JavaBean
    15  *  
    16  *  处理方式:
    17  *       在监听器中将spring的上下文交给tomcat的上下文中进行管理
    18  *       浏览器请求-->request-->servletContext-->springContext-->任意的JavaBean
    19  * @author ly
    20  *
    21  */
    22 @WebListener
    23 public class SpringLoaderListener implements ServletContextListener {
    24 
    25     @Override
    26     public void contextInitialized(ServletContextEvent sce) {
    27         
    28         System.out.println("tomcat一启动就触发了....");
    29         ServletContext tomcatContext = sce.getServletContext();
    30         String springXmlLocation  = tomcatContext.getInitParameter("springXmlLocation");
    31         System.out.println("spring的上下文配置文件"+springXmlLocation);
    32         ApplicationContext springContext =null;
    33         if(springXmlLocation == null || "".equals(springXmlLocation)) {
    34             
    35             springContext = new ClassPathXmlApplicationContext("/spring-context.xml");
    36         }else {
    37             springContext = new ClassPathXmlApplicationContext(springXmlLocation);
    38         }
    39         tomcatContext.setAttribute("spring_key", springContext);
    40         
    41     }
    42     
    43     
    44 }

    2.2 创建servlet  UserServlet

     1 package com.yuan.ioc.web;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.annotation.WebServlet;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 import org.springframework.context.ApplicationContext;
    12 
    13 @WebServlet("/user")
    14 public class UserServlet extends HttpServlet {
    15 
    16     @Override
    17     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18         doPost(req, resp);
    19     }
    20     
    21     @Override
    22     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23         System.out.println("处理用户请求");
    24         ApplicationContext springContext = (ApplicationContext) req.getServletContext().getAttribute("spring_key");
    25         UserAction userAction = (UserAction) springContext.getBean("yyy");
    26         userAction.upload();
    27     }
    28     
    29 }

      测试  IocTest

     1 package com.yuan.ioc.test;
     2 
     3 import org.springframework.context.ApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 import com.yuan.ioc.web.OrderAction;
     7 import com.yuan.ioc.web.UserAction;
     8 
     9 public class IocTest {
    10 
    11     public static void main(String[] args) {
    12 
    13 //        UserAction userAction = new UserAction();
    14 //        userAction.upload();
    15         
    16         ApplicationContext springContext = new ClassPathXmlApplicationContext("/spring-context.xml");
    17         UserAction userAction = (UserAction) springContext.getBean("yyy");
    18         OrderAction orderAction = (OrderAction) springContext.getBean("xxx");
    19         userAction.upload();
    20         orderAction.upload();
    21 //        userAction.test1();
    22         
    23     }
    24 
    25 }

    谢谢观看 !!!

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/ly-0919/p/11336329.html
Copyright © 2011-2022 走看看