Spring框架
什么是Spring
Spring是分层得javaSE轻量级开源框架,以IOC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming面向切面编程为内核)
Spring是众多优秀设计模式得组合(工厂,单例,代理,适配器,包装器,观察者)
分层:
JavaEE的三层结构:web层、业务层、数据访问层(持久层、集成层)
Struts是web层基于MVC设计模式框架
Mybatis,Hibernate是持久的一个ORM的框架
一站式:
Spring框架有对三层的每层解决方案
web层:Spring MVC
持久层:JDBC Template
业务层: Spring的Bean管理
Spring的好处:
方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象和依赖关系维护,交给Spring管理
AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
方便集成各种优秀框架 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、
Hibernate、MyBatis、Quartz等)的直接支持
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,降低JavaEE API的使用难度
1、创建Bean的三种方式
Bean元素:使用钙元素描述需要Spring容器管理的对象
class属性:被管理对象的完整类型名
name属性:给被管理的对象起个名字,获得对象时根据该名称获得对象
id属性:与name属性的作用相同
<?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="com.wm.impl.UserServiceimpl"></bean> <!--使用普通的工厂中的方法创建对象--> <bean id="userServiceFactory" class="com.wm.Factory.UserServiceFactory"></bean> <!--使用工厂中的静态方法创建--> <bean id="userService" factory-bean="userServiceFactory" factory-method="getUserService"></bean> <bean id="userService" class="com.wm.Factory.UserServiceStaticFactory" factory-method="getUserService"></bean> </beans>
理解:
这三种创建的方式的各有特点,也都有相似的地方,最重要的是理解属性的意思,id是指管理对象的名字,其实指的就是在我们测试的时候调用的对象的名字,
class是我们被管理对象的名字,也就是我们new的类,其中factory-bean 是指静态方法中的类名,factory-method见名知意指的是这个类下的方法,然后后期在测试的时候就可以通过id名直接进行类的实例化,不用再new对象,这也是我们使用Spring框架的意义!!!
2、Spring中的依赖注入
依赖注入: 能注入的数据: 基本类型和String 其他bean类型(在配置文件中或者注解配置过的bean) 复杂类型/集合类型
注入的方式:
-
第一种:使用构造函数提供
-
第二种:使用set方法提供
-
第三种:使用注解提供
构造方法注入
使用的标签:constructor-arg 标签出现的位置:bean标签的内部
标签中的属性: type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型 index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始 name:用于指定给构造函数中指定名称的参数赋值
value:用于提供基本类型和String类型的数据 ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
优势: 在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。 弊端: 改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。
set方法注入
涉及的标签:property 出现的位置:bean标签的内部
标签的属性: name:用于指定注入时所调用的set方法名称 value:用于提供基本类型和String类型的数据 ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
优势: 创建对象时没有明确的限制,可以直接使用默认构造函数 弊端: 如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
复杂类型的注入
list array set map propertioes等结构集合的注入
<?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="carBean" class="com.wm.pojo.Car"> <property name="cname" value="法拉利"></property> </bean> <bean id="user" class="com.wm.pojo.User"> <property name="id" value="1002"></property> <property name="name" value="rose"></property> <property name="password" value="123"></property> <property name="car" ref="carBean" ></property> </bean> <bean id="collectionDemo" class="com.wm.pojo.CollectionDemo"> <!--数组--> <property name="arr"> <array> <value>123</value> <value>213</value> <value>123</value> </array> </property> <property name="list" > <!--list集合 有序可重复--> <list> <value>jack</value> <value>jak</value> <value>tom</value> <ref bean="user"></ref> </list> </property> <property name="set"> <!--set集合 无序不可重复--> <set> <value>jack</value> <value>jak</value> <value>tom</value> <ref bean="user"></ref> </set> </property> <property name="map"> <!--map集合是以键值对得形式存储--> <map> <entry key="username" value="jack"></entry> <entry key-ref="user" value-ref="user"></entry> </map> </property> <property name="properties"> <!--properties类对象--> <props> <prop key="username">root</prop> <prop key="password">123456</prop> <prop key="url">jdbc:mysql:///db_name</prop> <prop key="DriverClassName">com.mysql.cj.jdbc.driver</prop> </props> </property> </bean> </beans>
最后题诗一首
秋名山上行人稀
几辆赛车较高低
当年车技今犹在
不见当年老司机