Spring3-1
作者:互联网
Spring基本上是所有企业开发的基础,公司都会问及Spring的如何实现甚至实现原理。本文从Spring是什么,如何配置Spring和bean配置来介绍Spring框架。
参考文章:
https://www.cnblogs.com/xu-cceed3w/p/9074313.html
https://blog.csdn.net/chs007chs/article/details/80536452
https://www.cnblogs.com/naihuangbao/p/10134247.html
Spring
1.Spring是一个开源框架
2.Spring为简化企业级应用开发而生,使用Spring可以使简化的JavaBean实现从前只有EJB才能实现的功能
3.Spring是一个IOC(DI)和AOP容器开源框架
总结:
Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架,Spring致力于提供一种方法管理你的业务对象,Spring的主要
目的是使JavaEE易用和促进好编程习惯,Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案,Spring贯穿表现
层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring特性
1.轻量级:Spring是非侵入式的
2.依赖注入:IOC(DI)
3.面向切面编程:AOP
4.一站式开发:自身提供了展现层的SpringMVC和持久层Spring JDBC
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring体系架构
模块结构图:核心容器(Core Container)、AOP(Aspect Oriented Programming)、设备支持(Instrument)、数据访问及集成(Data Access/Integratioin)、Web、报文发送(Messaging)、Test等模块。
1.核心容器:由spring-beans, spring-core, spring-context和spring-expression 4个模块组成。
(1)spring-core:控制反转IoC(Inversion of Control)与依赖注入DI(Dependency Injection)的基本实现,控制反转是种设计思想,即将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
(2)spring-beans:Bean工厂与bean的装配,BeanFactory接口使用控制反转对应用程序的配置、依赖性规范与实际的应用程序代码进行分离。但是BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。(面向Spring本身)
(3)spring-context:spring的context上下文,即IoC容器,它扩展了BeanFactory,为它添加了Bean生命周期管理、框架事件体系、资源加载透明化等功能,此外该模块还提供了很多企业级支持,如远程访问、任务调度等。ApplicationContext是该模块的核心接口,它扩展了BeanFactory,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。(面向Spring客户端开发者)
(4)spring-expression:spring表达式语言,是统计表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法、操作数组、集合等。最出色的要数函数调用和简单字符串的模板函数。
2.AOP和设备支持
(1)spring-aop:面向切面编程,aop就是在某一个类或方法执行前后打个标记,声明在执行到这里之前要先执行什么,执行完这里之后要接着执行什么,插入新的执行方法。在Spring中,它是以JVM的动态代理技术为基础,然后设计一系列AOP横切实现,比如前置通知、返回通知、异常通知等,同时Pointcut接口来匹配切入点,可以使用现有切入点来设计横切面,也可以扩展相关方法根据需求进行切入。
(2)spring-aspects:集成AspectJ, 主要是为Spring AOOP提供多种AOP实现方法。
(3)spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器。该模块是基于JAVA SE中的“java.lang.instrument”进行设计的,应该算是AOP的一个支援模块,主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的实现。
3.数据访问及集成
(1)spring-jdbc:jdbc的支持,主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类JdbcTemplate、SimpleJdbcTemplate、NamedParameterJdbcTemplate。
(2)spring-tx:事务控制,通过它的AOP配置,可以灵活的配置在任何一层,但是在很多的需求和应用,直接使用JDBC事务控制还是有其优势的。
(3)spring-orm:对象关系映射,集成orm框架,主要集成Hibernate、Java Persistence API(JPA)和Java Data Object(JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略。
(4)spring-oxm:对象xml映射,OXM是Object to XML Mapping的缩写,例如:jaxb, castor xmlbeans,JiBx,XStream等。
(5)spring-jms:java消息服务。
(6)spring-messaging:为Spring框架集成一些基础的报文发送应用。
4.Web
(1)spring-web:提供最基础的web支持,主要建立在核心容器上,通过Servlet或者Listener来初始化IOC容器,也包括一些与Web相关的支持。
(2)spring-webmvc:实现了Spring MVC的Web应用。
(3)spring-websocket:主要是与Web前端的全双工通讯协议。
(4)spring-webflux:是一个新的非阻塞式Reactive Web框架,可以用来建立异步、非阻塞、事件驱动的服务,并且扩展性非常好。
总结:
1.学习Spring的源码时,可以从Spring-core入手,其次是Spring-beans和spring-aop,随后是spring-context,再其次是spring-tx和spring-orm。
2.spring-core依赖了commons-logging,而其他模块都依赖了spring-core,整个spring框架都依赖了commons-logging。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring优点
1.方便解耦,简化开发,依赖注入
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
2.AOP 编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
3.声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
4.方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序方便集成各种优秀框架Spring不排斥各种优秀的开源框架,其内部
提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持;
5. 降低JavaEE API的使用难度
Spring对 JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring配置
1.下载插件 (下载地址)https://spring.io/tools3/sts/all
2.导入相关包
①Spring jar包 (下载地址)http://repo.spring.io/libs-release-local/org/springframework/spring/
②commons-logging.jar包 (下载地址)http://commons.apache.org/proper/commons-logging/download_logging.cgi
3.创建Spring Bean Configuration File 的xml文件
4.编写API
①创建Spring的IOC容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("stu_teach.xml");
②从IOC容器获取Bean实例
Teacher teacher = (Teacher) applicationContext.getBean("teacher1");
List<Student> students = (List<Student>) applicationContext.getBean("stus");
③调用方法
④配置bean的xml文件
1 <bean id="teacher1" class="com.thxy.spring.Teacher" p:name="Liu" 2 p:school="thxy" p:stus-ref="stus"></bean> 3 4 <bean id="stu1" class="com.thxy.spring.Student" p:name="aaa" 5 p:clazz="17软件一班"></bean> 6 <bean id="stu2" class="com.thxy.spring.Student" p:name="bbb" 7 p:clazz="17软件一班"></bean> 8 <bean id="stu3" class="com.thxy.spring.Student" p:name="ccc" 9 p:clazz="17软件一班"></bean> 10 <bean id="stu4" class="com.thxy.spring.Student" p:name="ddd" 11 p:clazz="17软件一班"></bean> 12 <bean id="stu5" class="com.thxy.spring.Student" p:name="eee" 13 p:clazz="17软件一班"></bean> 14 <bean id="stu6" class="com.thxy.spring.Student" p:name="fff" 15 p:clazz="17软件一班"></bean> 16 17 <util:list id="stus"> 18 <ref bean="stu1"></ref> 19 <ref bean="stu2"></ref> 20 <ref bean="stu3"></ref> 21 <ref bean="stu4"></ref> 22 <ref bean="stu5"></ref> 23 <ref bean="stu6"></ref> 24 </util:list>
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总结:
1.整个spring框架都依赖了commons-logging。
2.Spring关联源码分析源码Source attchment(业界说法:优秀的软件工程师需要研究Spring源码3次)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
详解Spring Bean配置
前提储备知识:
IOC:Incersion of Control 反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动将资源推送给他所管理的组件(Bean),组件所需要做的是选择一种合适的方式(属性注入,构造器注入)来接受资源,也被称为查找的被动形式。
DI:IOC的另一种表述方式:即组件以一些预先定义的方法(属性注入,构造器注入)来接受容器的资源注入。
IOC容器:BeanFactory&ApplicationContext
1.BeanFactory:BeanFactory是Spring基础设施,面向Spring本身
2.ApplicationContext:ApplicationContext面向Spring开发者,获取容器bean对象
配置方式:基于全类名配置
配置形式:基于xml文件配置
依赖注入方式:
1.属性注入
Bean类
1 package com.thxy.spring.demo; 2 3 public class Student { 4 private String name; 5 private String school; 6 private String major; 7 private String clazz; 8 9 public void setName(String name) { 10 this.name = name; 11 } 12 13 public void setSchool(String school) { 14 this.school = school; 15 } 16 17 public void setMajor(String major) { 18 this.major = major; 19 } 20 21 public void setClazz(String clazz) { 22 this.clazz = clazz; 23 } 24 25 @Override 26 public String toString() { 27 return "Student [name=" + name + ", school=" + school + ", major=" + major + ", clazz=" + clazz + "]"; 28 } 29 30 public Student(String name, String school, String major, String clazz) { 31 this(); 32 this.name = name; 33 this.school = school; 34 this.major = major; 35 this.clazz = clazz; 36 } 37 38 public Student() { 39 System.out.println("init a student..."); 40 } 41 42 }
Main实现类
1 package com.thxy.spring.demo; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Main { 7 public static void main(String[] args) { 8 @SuppressWarnings("resource") 9 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("student_teacher.xml"); 10 Student student = (Student) applicationContext.getBean("student_1"); 11 System.out.println(student.toString()); 12 } 13 }
Bean配置文件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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="student_1" class="com.thxy.spring.demo.Student"> 9 <property name="name" value="aaa"></property> 10 <property name="school" value="天河学院"></property> 11 <property name="major" value="软件专业"></property> 12 <property name="clazz"> 13 <value><![CDATA[17级]]></value> 14 </property> 15 </bean> 16 </beans>
①class:bean类的全类名通过反射方式在IOC容器创建bean,提供默认构造器
②id:标识容器中的bean,id是唯一的
③property:bean类中的成员属性
④value:通过setter的方式向bean成员属性赋值
总结:
1.字面值:可用字符串表示的值,可用通过<value>元素标签或value属性注入基本数据类型及其封装类,String等类型可以采取字面值注入的方式。
2.若字面值中包含特殊字符,可以采用<![CDATA[]]>把字面值包裹起来。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.属性注入级联对象
Bean类
①Student类
1 package com.thxy.spring.demo; 2 3 public class Student { 4 private String name; 5 private String school; 6 private String major; 7 private String clazz; 8 private Teacher teacher; 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 public void setSchool(String school) { 15 this.school = school; 16 } 17 18 public void setMajor(String major) { 19 this.major = major; 20 } 21 22 public void setClazz(String clazz) { 23 this.clazz = clazz; 24 } 25 26 public void setTeacher(Teacher teacher) { 27 this.teacher = teacher; 28 } 29 30 @Override 31 public String toString() { 32 return "Student [name=" + name + ", school=" + school + ", major=" + major + ", clazz=" + clazz + ", teacher=" 33 + teacher + "]"; 34 } 35 36 public Student(String name, String school, String major, String clazz, Teacher teacher) { 37 this(); 38 this.name = name; 39 this.school = school; 40 this.major = major; 41 this.clazz = clazz; 42 this.teacher = teacher; 43 } 44 45 public Student() { 46 System.out.println("init a student..."); 47 } 48 49 }
②Teacher类
1 package com.thxy.spring.demo; 2 3 public class Teacher { 4 private String name; 5 private String school; 6 private String major; 7 8 public void setName(String name) { 9 this.name = name; 10 } 11 12 public void setSchool(String school) { 13 this.school = school; 14 } 15 16 public void setMajor(String major) { 17 this.major = major; 18 } 19 20 @Override 21 public String toString() { 22 return "Teacher [name=" + name + ", school=" + school + ", major=" + major + "]"; 23 } 24 25 public Teacher(String name, String school, String major) { 26 this(); 27 this.name = name; 28 this.school = school; 29 this.major = major; 30 } 31 32 public Teacher() { 33 System.out.println("init a teacher..."); 34 } 35 36 }
Main实现类
1 package com.thxy.spring.demo; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Main { 7 public static void main(String[] args) { 8 @SuppressWarnings("resource") 9 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("student_teacher.xml"); 10 Student student = (Student) applicationContext.getBean("student_1"); 11 System.out.println(student.toString()); 12 } 13 }
Bean配置文件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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="student_1" class="com.thxy.spring.demo.Student"> 9 <property name="name" value="aaa"></property> 10 <property name="school" value="天河学院"></property> 11 <property name="major" value="软件专业"></property> 12 <property name="clazz"> 13 <value><![CDATA[17级]]></value> 14 </property> 15 <property name="teacher" ref="teacher_1"></property> 16 </bean> 17 <bean id="teacher_1" class="com.thxy.spring.demo.Teacher"> 18 <property name="name" value="Liu"></property> 19 <property name="school" value="天河学院"></property> 20 <property name="major"> 21 <value><![CDATA[<计算机系>]]></value> 22 </property> 23 </bean> 24 </beans>
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.属性注入之内部bean(不能被外部引用)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bean配置文件xml文件
1 <bean id="Student_2" class="com.thxy.spring.demo.Student"> 2 <property name="name" value="bbb"></property> 3 <property name="school" value="天河学院"></property> 4 <property name="major" value="软件工程"></property> 5 <property name="clazz" value="17级"></property> 6 <property name="teacher"> 7 <bean class="com.thxy.spring.demo.Teacher"> 8 <property name="name" value="Liu"></property> 9 <property name="major" value="软件工程"></property> 10 <property name="school" value="天河学院"></property> 11 </bean> 12 </property> 13 </bean>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4.构造器注入之级联对象
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bean配置文件xml文件
1 <bean id="Student_3" class="com.thxy.spring.demo.Student"> 2 <constructor-arg value="ccc" type="java.lang.String"></constructor-arg> 3 <constructor-arg value="天河学院" type="java.lang.String"></constructor-arg> 4 <constructor-arg value="软件工程" type="java.lang.String"></constructor-arg> 5 <constructor-arg value="17级" type="java.lang.String"></constructor-arg> 6 <constructor-arg type="com.thxy.spring.demo.Teacher" 7 ref="Teacher_3"></constructor-arg> 8 </bean> 9 <bean id="Teacher_3" class="com.thxy.spring.demo.Teacher"> 10 <constructor-arg value="Liu" type="java.lang.String"></constructor-arg> 11 <constructor-arg value="天河学院" type="java.lang.String"></constructor-arg> 12 <constructor-arg type="java.lang.String"> 13 <value><![CDATA[<计算机>]]></value> 14 </constructor-arg> 15 </bean>
缺点:构造器注入需要和构造器中参数个数和位置一致。若不一致则抛出异常
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'Student_3' defined in class path resource [student_teacher.xml]: Unsatisfied dependency expressed through constructor parameter 3: Ambiguous argument values for parameter of type [java.lang.String] - did you specify the correct bean references as arguments?
改良
1 <bean id="Student_3" class="com.thxy.spring.demo.Student"> 2 <constructor-arg value="17级" name="clazz"></constructor-arg> 3 <constructor-arg value="天河学院" name="school"></constructor-arg> 4 <constructor-arg value="软件工程" name="major"></constructor-arg> 5 <constructor-arg type="com.thxy.spring.demo.Teacher" 6 ref="Teacher_3"></constructor-arg> 7 <constructor-arg value="ccc" name="name"></constructor-arg> 8 </bean> 9 <bean id="Teacher_3" class="com.thxy.spring.demo.Teacher"> 10 <constructor-arg value="Liu" type="java.lang.String"></constructor-arg> 11 <constructor-arg value="天河学院" type="java.lang.String"></constructor-arg> 12 <constructor-arg type="java.lang.String"> 13 <value><![CDATA[<计算机>]]></value> 14 </constructor-arg> 15 </bean>
使用name属性可以将构造器注入任意改变位置不需和构造函数的位置一致。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单独为级联属性赋值(属性需要先初始化才可以为级联属性赋值)
1 <bean id="Student_4" class="com.thxy.spring.demo.Student"> 2 <constructor-arg name="name" value="ddd"></constructor-arg> 3 <constructor-arg name="school" value="天河学院"></constructor-arg> 4 <constructor-arg name="major" value="软件工程"></constructor-arg> 5 <constructor-arg name="clazz"> 6 <null /> 7 </constructor-arg> 8 <constructor-arg name="teacher" ref="teacher_1"> 9 </constructor-arg> 10 <property name="teacher.name" value="liusss"></property> 11 </bean>
注意:
1.<property name="teacher.name" value="liusss"></property>一句中需要Student中有getter方法赋值获取
2.引用赋值为null表达是<null />
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
配置集合属性
List集合
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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="student_1" class="com.spring.demo.Student"> 9 <property name="name" value="aaa"></property> 10 <property name="majoy" value="软件工程"></property> 11 </bean> 12 <bean id="student_2" class="com.spring.demo.Student"> 13 <property name="name" value="bbb"></property> 14 <property name="majoy" value="软件工程"></property> 15 </bean> 16 <bean id="teacher_1" class="com.spring.demo.Teacher"> 17 <property name="name" value="ccc"></property> 18 <property name="students"> 19 <list> 20 <ref bean="student_1"></ref> 21 <ref bean="student_2"></ref> 22 </list> 23 </property> 24 </bean> 25 </beans>
1 package com.spring.demo; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Main { 7 public static void main(String[] args) { 8 @SuppressWarnings("resource") 9 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("stu_teach.xml"); 10 Teacher teacher = applicationContext.getBean(Teacher.class); 11 System.out.println(teacher.toString()); 12 } 13 }
Map集合
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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="student_1" class="com.spring.demo.Student"> 9 <property name="name" value="aaa"></property> 10 <property name="majoy" value="软件工程"></property> 11 </bean> 12 <bean id="student_2" class="com.spring.demo.Student"> 13 <property name="name" value="bbb"></property> 14 <property name="majoy" value="软件工程"></property> 15 </bean> 16 <bean id="teacher_1" class="com.spring.demo.Teacher"> 17 <property name="name" value="ccc"></property> 18 <property name="students"> 19 <map> 20 <entry key="AA" value-ref="student_1"></entry> 21 <entry key="BB" value-ref="student_2"></entry> 22 </map> 23 </property> 24 </bean> 25 </beans>
使用<props>定义java.until.properties该标签使用多个<prop>做子标签,每个<prop>标签必须定义key属性
1 package com.spring.demo; 2 3 import java.util.Properties; 4 5 public class DataSource { 6 private Properties properties; 7 8 public void setProperties(Properties properties) { 9 this.properties = properties; 10 } 11 12 @Override 13 public String toString() { 14 return "DataSource [properties=" + properties + "]"; 15 } 16 17 public DataSource(Properties properties) { 18 this(); 19 this.properties = properties; 20 } 21 22 public DataSource() { 23 System.out.println("init properties"); 24 } 25 26 }
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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="dataScoure" class="com.spring.demo.DataSource"> 9 <property name="properties"> 10 <props> 11 <prop key="user">root</prop> 12 <prop key="password">123</prop> 13 <prop key="driver">com.mysql.jdbc.Driver</prop> 14 <prop key="url">jdbc:mysql///spring</prop> 15 </props> 16 </property> 17 </bean> 18 </beans>
配置单例的集合bean,以供多个bean进行引用需要导入util空间
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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="student_1" class="com.spring.demo.Student"> 9 <property name="name" value="aaa"></property> 10 <property name="majoy" value="软件工程"></property> 11 </bean> 12 <bean id="student_2" class="com.spring.demo.Student"> 13 <property name="name" value="bbb"></property> 14 <property name="majoy" value="软件工程"></property> 15 </bean> 16 <bean id="teacher_1" class="com.spring.demo.Teacher"> 17 <property name="name" value="ccc"></property> 18 <property name="students" ref="stus"> 19 </property> 20 </bean> 21 <util:map id="stus"> 22 <entry key="AAA" value-ref="student_1"></entry> 23 <entry key="BBB" value-ref="student_2"></entry> 24 </util:map> 25 </beans>
使用p命名空间为bean属性赋值,需要先导入p空间,相对于传统配置更简洁
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 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> 8 <bean id="student_1" class="com.spring.demo.Student"> 9 <property name="name" value="aaa"></property> 10 <property name="majoy" value="软件工程"></property> 11 </bean> 12 <bean id="student_2" class="com.spring.demo.Student"> 13 <property name="name" value="bbb"></property> 14 <property name="majoy" value="软件工程"></property> 15 </bean> 16 <util:map id="stus"> 17 <entry key="AAA" value-ref="student_1"></entry> 18 <entry key="BBB" value-ref="student_2"></entry> 19 </util:map> 20 <bean id="teacher_2" class="com.spring.demo.Teacher" p:name="ddd" p:students-ref="stus"></bean> 21 </beans>
由上述可知:使用p命名空间和单例的集合bean的util空间可以更好配置bean。
标签:school,String,spring,Spring,Spring3,public,name 来源: https://www.cnblogs.com/KYAOYYW/p/10562329.html