Spring框架基础(上)

时间:2023-03-08 17:53:51
  • spring是开源对轻量级框架
  • spring核心主要两部分
    • aop
      • 面向切面编程,扩展功能不是修改源代码实现
      • aop采用横向抽取机制,取代了传统纵向继承体系重复代码(性能监视、事务管理、安全检查、缓存)
      • 使用动态代理方式实现横向抽取机制
        •   使用JDK动态代理,针对有接口情况
        •   创建接口类的平级对象
        • 这个对象不是真正对象,是代理对象,实现和类相同的功能
        •   使用cglib动态代理,针对没有接口情况
          • 创建类的子类的代理对象
          • 在子类里面调用父类的方法完成增强
      • aop操作术语
        • Joinnoint(连接点)
          • 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
          • 类里面那些方法可以被增强,这些方法称为连接点
        • Pointcut(切入点)
          • 所谓切入点是指我们要对那些Joinnoint进行拦截的定义
          • 在类里面可以有很多的方法被增强,而实际增强的方法称为切入点
        • Advice(通知/增强)
          • 所谓通知是指拦截到Joinnoint之后所要做的事情就是通知
          • 通知分类
            • 前置通知:在方法之前执行
            • 后置通知:在方法之后执行
            • 异常通知:方法出现异常
            • 最终通知:在后置之后执行
            • 环绕通知:在方法之前和之后执行
          • 功能扩展的逻辑,称为增强。
        • Introduction(引介)
          • 引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field
        • Target(目标对象)
          • 代理的目标对象(要增强的类)
          • 增强方法所在的类,叫做目标对象
        • Weaving(织入)
          • 是把增强应用到目标的过程
          • 把advice应用到target的过程
        • Proxy(代理)
          • 一个类被ACP织入增强后,就产生一个结果代理类
        • Aspect(切面)
          • 是切入点和通知(引介)的结合
          • 把增强应用到具体方法上面,过程称为切面
      • AspectJ
        • AspectJ是一个基于Java语言的AOP框架
        • AspectJ是一个面向切面的框架,它扩展了Java语言
        • AspectJ定义了aop语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件
      • AspectJ实现aop

        • 导入jar包spring-aop-4.3.5.RELEASE.jar、spring-aspects-4.3.5.RELEASE.jar、aspectjweaver-1.9.2.jar、aopalliance-1.0.jar
        • 导入约束
          <?xml version="1.0" encoding="UTF-8" ?>
          <!--
          http://www.springframework.org/schema/context/spring-context.xsd:用于注解的约束
          http://www.springframework.org/schema/aop/spring-aop.xsd:用于aop的约束
          -->
          <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:aop="http://www.springframework.org/schema/aop"
          xsi:schemaLocation="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
        • 具体实现
          • 基于aspectJ的xml配置
            /**
            *
            */
            public class Test02 { public void test02() {
            System.out.println("前置增强");
            }
            public void test02After(){
            System.out.println("后置增强");
            }
            /**
            *
            * @param proceedingJoinPoint 被增强的的方法
            */
            public void test02Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            System.out.println("环绕增强前");
            proceedingJoinPoint.proceed();
            System.out.println("环绕增强后");
            } } /**
            *
            */
            public class Test01 { public void test01(){
            System.out.println("切入点");
            }
            } <!-- 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"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:aop="http://www.springframework.org/schema/aop"
            xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置对象 -->
            <bean id="test01" class="cn.muriel.auto.aop.Test01"/>
            <bean id="test02" class="cn.muriel.auto.aop.Test02"/> <!-- 配置aop操作 -->
            <aop:config>
            <!--
            配置切入点(*代表匹配所有)
            execution(<访问修饰符> ? <返回类型><方法名>(<参数>)<异常>)
            execution(* cn.muriel.auto.aop.Test01.test01(..))
            execution(* cn.muriel.auto.aop.Test01.*(..))
            execution(* *.*(..))
            execution(* save*(..))//匹配所有save开头的方法
            -->
            <aop:pointcut id="pointcut1" expression="execution(* cn.muriel.auto.aop.Test01.test01(..))"/>
            <!-- 配置增强类型 -->
            <aop:aspect ref="test02">
            <!--
            配置增强类型
            method:增强类里面使用哪个方法作为前置
            -->
            <!-- 前置增强 -->
            <aop:before method="test02" pointcut-ref="pointcut1"/>
            <!-- 后置增强 -->
            <aop:after-returning method="test02After" pointcut-ref="pointcut1"/>
            <!-- 环绕增强 -->
            <aop:around method="test02Around" pointcut-ref="pointcut1"/>
            </aop:aspect>
            </aop:config> </beans> /**
            * 测试代码
            */
            public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("aop/aop.xml"); Test01 test01 = (Test01) applicationContext.getBean("test01");
            test01.test01(); }
            }
          • 基于aspectJ的注解方式
            @Aspect
            public class Test02 { @Before(value = "execution(* cn.muriel.auto.aop.Test01.test01(..))")
            public void test02() {
            System.out.println("前置增强");
            } @AfterReturning(value = "execution(* cn.muriel.auto.aop.Test01.test01(..))")
            public void test02After(){
            System.out.println("后置增强");
            } /**
            *
            * @param proceedingJoinPoint 被增强的的方法
            */
            @Around(value = "execution(* cn.muriel.auto.aop.Test01.test01(..))")
            public void test02Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            System.out.println("环绕增强前");
            proceedingJoinPoint.proceed();
            System.out.println("环绕增强后");
            } } /**
            *
            */
            public class Test01 { public void test01(){
            System.out.println("切入点");
            }
            } <!-- 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"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:aop="http://www.springframework.org/schema/aop"
            xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 开启aop操作 -->
            <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!-- 配置对象 -->
            <bean id="test01" class="cn.muriel.auto.aop.Test01"/>
            <bean id="test02" class="cn.muriel.auto.aop.Test02"/> </beans> /**
            * 测试代码
            */
            public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("aop/aop.xml"); Test01 test01 = (Test01) applicationContext.getBean("test01");
            test01.test01(); }
            }
    • ioc
      • 控制反转,把对象对创建不是通过new方式实现,而是交给spring配置创建类对象
      • IOC和DI区别
        • IOC:控制反转,把对象创建交给spring进行配置
        • DI:依赖注入,向类里面的属性中设置值
        • IOC和DI关系
          • 依赖注入不能单独存在,需要在ioc基础之上完成操作
      • ioc操作
        • ioc的配置文件方式
          <!-- 配置文件 -->
          <?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 id="userService" class="cn.xxx.auto.service.UserService"/> </beans> <!-- 测试代码 -->
          public class TestUtil { private static ApplicationContext applicationContext; public static void main(String[] args) { applicationContext = new ClassPathXmlApplicationContext("service/service.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); userService.test(); }
        • ioc的注解方式
          • 什么是注解
            • 代码里面特殊标记,使用注解可以完成功能
          • 注解的写法
            • @注解名称(属性名称=属性值)
          • 注解的使用范围
            • 方法
            • 属性
          • 常用注解
            • @Controller:WEB层
            • @Service:业务层
            • @Repository:持久层
            • @Component:类
          • 注解创建对象
            <!-- 导入基本的jar包和aop.jar包 -->
            <!-- 创建类、方法 --> <!-- 创建spring配置文件,引入约束 --> <?xml version="1.0" encoding="UTF-8" ?>
            <!--
            http://www.springframework.org/schema/context/spring-context.xsd:用于注解的约束
            -->
            <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> <!--
            开启注解扫描:到包里面扫描类、方法、属性上面是否有注解
            -->
            <context:component-scan base-package="cn.xxx.auto.pojo"/> <!--
            开启注解扫描:扫描属性上面的注解 <context:annotation-config></context:annotation-config>-->
            </beans> /**
            * 注解创建对象:在创建对象的类上面使用注解实现
            */
            @Component(value="user") //相当于<bean id="user" class="" />
            @Scope(value="prototype")//默认为单实例,prototype为多实例
            public class User { public void test(){
            System.out.println("创建成功");
            }
            } /**
            * 测试代码
            */
            public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("pojo/pojo.xml"); User user = (User) applicationContext.getBean("user"); user.test();
            }
          • 注解注入属性(Autowired)
            <!-- -->
            <?xml version="1.0" encoding="UTF-8" ?>
            <!--
            http://www.springframework.org/schema/context/spring-context.xsd:用于注解的约束
            -->
            <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
            <!-- 导入文件 -->
            <import resource="classpath:dao/dao.xml"/>
            <import resource="classpath:pojo/pojo.xml"/> <context:component-scan base-package="cn.xxx.auto.service"></context:component-scan>
            <!--<bean id="userService" class="cn.xxx.auto.service.UserService">-->
            <!--
            注入dao对象:
            name:service类里面属性名称
            value:赋值给name的字符串
            ref:赋值给name的对象,配置bean的id值 <property name="userDao" ref="userDao"/>
            </bean>--> </beans> /**
            *
            */
            @Component(value = "userService")
            public class UserService { //在dao属性上面使用注解完成对象注入
            @Autowired
            private UserDao userDao; public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
            } public void addUser(User user) { userDao.insert(user);
            }
            } /**
            *
            */
            public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("service/service.xml"); UserService userService = (UserService) applicationContext.getBean("userService");
            UserDao userDao = (UserDao) applicationContext.getBean("userDao");
            User user = (User) applicationContext.getBean("user"); userService.setUserDao(userDao); userService.addUser(user); }
          • 注解注入属性(Resource)
            <!-- -->
            <?xml version="1.0" encoding="UTF-8" ?>
            <!--
            http://www.springframework.org/schema/context/spring-context.xsd:用于注解的约束
            -->
            <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
            <!-- 导入文件 -->
            <import resource="classpath:dao/dao.xml"/>
            <import resource="classpath:pojo/pojo.xml"/> <context:component-scan base-package="cn.xxx.auto.service"></context:component-scan>
            <!--<bean id="userService" class="cn.xxx.auto.service.UserService">-->
            <!--
            注入dao对象:
            name:service类里面属性名称
            value:赋值给name的字符串
            ref:赋值给name的对象,配置bean的id值 <property name="userDao" ref="userDao"/>
            </bean>--> </beans> /**
            *
            */
            @Repository(value = "userDao")
            public class UserDao implements UserMapper { } /**
            *
            */
            @Component(value = "userService")
            public class UserService { //在dao属性上面使用注解完成对象注入
            //name属性值写注解创建dao对象的value值
            @Resource(name = "userDao")
            private UserDao userDao; public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
            } public void addUser(User user) { userDao.insert(user);
            }
            } /**
            *
            */
            public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("service/service.xml"); UserService userService = (UserService) applicationContext.getBean("userService");
            UserDao userDao = (UserDao) applicationContext.getBean("userDao");
            User user = (User) applicationContext.getBean("user"); userService.setUserDao(userDao); userService.addUser(user); }
      • ioc底层原理使用技术
        • xml配置文件
        • dom4j解决xml
        • 工厂设计模式
        • 反射 
          /**
          * ioc底层原理
          */
          public class UserFactory { private String serviceId = "userService"; /**
          * (1)使用dom4j解析xml方法
          * (2)使用反射创建对象
          *
          * @return 返回UserService对象的方法
          */
          public UserService getUserService() {
          //导入dom4j.jar
          SAXReader saxReader = new SAXReader(); //获取指定xml文件
          URL url = this.getClass().getClassLoader().getResource("service/service.xml");
          try {
          Document document = saxReader.read(url);
          //获取根结点
          Element rootElement = document.getRootElement(); //获取根结点下的子节点
          List elements = rootElement.elements();
          String serviceClass = "";
          //遍历取出子节点
          for (int i = 0; i < elements.size(); i++) {
          //获取子节点
          Element element = (Element) elements.get(i);
          //获取子节点下的参数
          Attribute idAttribute = element.attribute("id");
          Attribute classAttribute = element.attribute("class"); if (serviceId.equals(idAttribute.getValue())) {
          serviceClass = classAttribute.getValue();
          break;
          }
          } System.out.println(serviceClass); Class<?> newClass = Class.forName(serviceClass); return (UserService) newClass.newInstance();
          } catch (DocumentException e) {
          e.printStackTrace();
          } catch (ClassNotFoundException e) {
          e.printStackTrace();
          } catch (IllegalAccessException e) {
          e.printStackTrace();
          } catch (InstantiationException e) {
          e.printStackTrace();
          } return null;
          } /**
          * 测试
          * @param args
          */
          public static void main(String[] args) {
          UserFactory service = new UserFactory();
          UserService userService = service.getUserService();
          userService.test();
          }
          }
  • spring是一站式框架
    • spring在javaee三层架构中,每一层都提供不同的解决技术
      • web层:SpringMvc
      • service层:spring的ioc
      • dao层:spring的jdbcTemplate
  • spring入门(ioc,service的创建)
    • 导入jar包
      • 做spring最基本功能时,只需要导入beans、core、context、expression这四个jar包
      • 导入支持日志输出的jar包,commons-logging-1.2.jar
    • 创建类,在类里面创建方法
      public class UserService  {
      
          public void test(){
      System.out.println("获取成功");
      }
      }
    • 创建spring配置文件,配置创建类
      • 建议放到src下面,官方建议applicationContext.xml
      • 引入schema约束(spring/framework/reference/html/xsd-configuration.html)
    • 写代码测试对象创建
  • spring的bean管理(xml配置文件)
    • bean是实例化的方式
      • 使用类的无参数构造创建
        <bean id="user" class="cn.xxx.auto.pojo.User"/>
      • 使用静态工厂创建
        public class UserFactory  {
        
            public static User getUser() {
        
                return new User();
        } } <!-- 配置文件 -->
        <!--
        destroy-method:静态工厂中的静态方法
        -->
        <bean id="user" class="cn.xxx.auto.factory.UserFactory" destroy-method="getUser"/>
      • 使用实例工厂创建
        public class UserFactory  {
        
            public User getUser() {
        
                return new User();
        } } <!-- 配置文件 -->
        <!--
        factory-bean:实例工厂中的对象
        factory-method:实例工厂中的方法
        -->
        <bean id="userFactory" class="cn.xxx.auto.factory.UserFactory" destroy-method="getUser"/>
        <bean id="user" factory-bean="userFactory" factory-method="getUser" />
    • bean标签常用属性
      • id属性
        • 起名称,id属性名称任意命名。
        • 通过id值得到配置对象
      • class属性
        • 创建对象所在类的全路径
      • name属性
        • 功能与id属性一样
        • 与id属性区别在于,id不可以包含特殊符号
      • scope属性
        • singleton:默认值。单例。获取都是同一个对象
        • prototype:多例。获取是不同对象
        • request:创建对象把对象放到request域里面
        • session:创建对象把对象放到session域里面
        • globalSession:创建对象把对象放到globalSession域里面
    • 属性注入方式  
      • 使用set方法注入
        /**
        * 测试代码
        */
        public class TestUtil {   private String obj;
        public void setObj(String obj) {
        this.obj = obj;
        }
        public void test(){
           System.out.println("obj="+obj);
        } public static void main(String[] args) { TestUtil testUtil = new TestUtil();
        testUtil.setObj("obj");
        test();
        }
        } <!-- 使用有参数构造注入属性 -->
        <bean id="user" class="cn.muriel.mybatis.utils.TestUtil">
        <!-- 使用有参构造注入 -->
        <property name="obj" value="obj"/>
        </bean>
      • 有参数构造注入
        /**
        * 测试代码
        */
        public class TestUtil { public TestUtil(String obj) {
        System.out.println(obj);
        } public static void main(String[] args) { TestUtil testUtil = new TestUtil("obj");
        }
        } <!-- 使用有参数构造注入属性 -->
        <bean id="user" class="cn.muriel.mybatis.utils.TestUtil">
        <!-- 使用有参构造注入 -->
        <constructor-arg name="obj" value="obj"/>
        </bean>
      • 使用接口注入(spring不支持)
    • spring注入属性(有参构造和set方法)
    • spring注入对象类型属性
      <?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 id="userDao" class="cn.xxx.auto.dao.UserDao"></bean> </beans> <?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"> <!-- 导入文件 -->
      <import resource="classpath:dao/dao.xml"/> <bean id="userService" class="cn.xxx.auto.service.UserService">
      <!--
      注入dao对象:
      name:service类里面属性名称
      value:赋值给name的字符串
      ref:赋值给name的对象,配置bean的id值
      -->
      <property name="userDao" ref="userDao"/>
      </bean> </beans> public class UserService { //声明mapper对象
      private UserDao userDao; public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
      } public void addUser() { System.out.println("测试");
      }
      } /**
      * 测试代码
      */
      public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("service/service.xml");
      UserService userService = (UserService) applicationContext.getBean("userService");
      UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userService.setUserDao(userDao); userService.addUser();
      } }
    • p名称空间注入
      <?xml version="1.0" encoding="UTF-8" ?>
      <!--
      引入名称空间p:xmlns:p="http://www.springframework.org/schema/p"
      -->
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:p="http://www.springframework.org/schema/p"
      xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDao" class="cn.xxx.auto.dao.UserDao"></bean> </beans> <?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"> <!-- 导入文件 -->
      <import resource="classpath:dao/dao.xml"/> <bean id="userService" class="cn.xxx.auto.service.UserService" p:pname-ref="userDao> </bean> </beans> public class UserService { //声明mapper对象
      private UserDao userDao; public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
      } public void addUser() { System.out.println("测试");
      }
      } /**
      * 测试代码
      */
      public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("service/service.xml");
      UserService userService = (UserService) applicationContext.getBean("userService");
      UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userService.setUserDao(userDao); userService.addUser();
      } }
    • spring注入复杂数据
      • 数组
      • list集合
      • map集合
      • properties类型
        <?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 id="userDao" class="cn.xxx.auto.dao.UserDao"></bean> </beans> <?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 id="userService" class="cn.xxx.auto.service.UserService">
        <!--
        arrs:
        -->
        <property name="arrs">
        <list>
        <value>1</value>
        <value>2</value>
        <value>3</value>
        </list>
        </property>
        <!--
        list:
        -->
        <property name="list">
        <list>
        <value>11</value>
        <value>22</value>
        <value>33</value>
        </list>
        </property>
        <!--
        map:
        -->
        <property name="map">
        <map>
        <entry key="username" value="aa"></entry>
        <entry key="password" value="bb"></entry>
        </map>
        </property>
        <!-- -->
        <property name="properties">
        <props>
        <prop key="username">aa</prop>
        <prop key="password">bb</prop>
        </list>
        </property> </bean> </beans> public class UserService { private String[] arrs;
        private List<String> list;
        private Map<String,String> map;
        private Properties properties; public void setArrs(String[] arrs) {
        this.arrs = arrs;
        }
        public void setList(List<String> list) {
        this.list = list;
        }
        public void setMap(Map<String,String> map) {
        this.map = map;
        }
        public void setProperties(Properties properties) {
        this.properties = properties;
        } public void addUser() { System.out.println("arrs="+arrs);
        System.out.println("list="+list);
        System.out.println("map="+map);
        System.out.println("properties="+properties);
        }
        } /**
        * 测试代码
        */
        public class TestUtil { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("service/service.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userService.setUserDao(userDao); userService.addUser();
        } }