Spring框架的介绍、搭建、配置详解和注解
Spring框架的介绍
1. spring框架的作用
Spring框架是一个一站式框架(一步就到位 j2ee 三层开发(web service dao)spring框架全部解决)。Spring本身就有这三层对应的功能 web:springMVC springBoot service spring dao : spring 整合了jdbc。spring本身是一个容器,放了什么对象就拥有了对象的功能。Hibernate和struts2 都可以放到这个容器里面。
Spring的优点
简化软件开发的复杂性:
(1)IOC(Inversion of Control) 控制反转
(2)AOP(Aspect Oriented Programming)思维
(3)不仅不排斥其他的框架,并且帮助其他框架管理对象
(4)整合了jdbc spring jdbc
(5)aop 事务
(6)junit 单元测试
Spring框架的搭建
1. 导包
spring-3.0.2 spring框架整合的其他jar包 当年市面上所有的包
spring-5.0.2 spring框架本身的包
打开对应spring框架包之后
libs:jar包
schema:约束文件,spring框架约束文件有很多
Spring框架将功能进行了分层
Data...:dao层的功能
Web : 对应的是web层的功能
中间的部分是使用上面的两个层支持的jar包
下面的是spring核心包
导入核心包:
还需要日志包,市面上有非常好的日志: apache logging log4j 去spring当年整合的文件夹中去找。
2. 创建一个对象 User (bean类)
public class Workers { } 必须要有一个无参的构造函数 书写两个属性的get和set方法并重写toString() |
3. 书写配置文件
配置文件吗,名字和位置都没有要求
但是建议放在src路径下 applicationContext.xml
导入约束
配置bean类
<bean name="workers" class="cn.hd.text_again.Workers"></bean>
4. 书写测试类
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 读取配置文件 |
测试之后的代码:
Spring框架的思想
(1)Ioc(控制反转)由spring框架来帮我们创建对象
(2)di(依赖注入)为了实现ioc思想
对象属性的注入
spring 工厂
BeanFactory:
是spring最原始的接口 创建实体bean类用的,适用于资源贫瘠
beanFactory:创建对象的方式 什么时候使用什么时候创建
applicationContext
现在用的
创建对象的方式是加载完配置文件后就创建
FileSystemXmlApplicationContext 从指定的绝对路径读取配置文件
ClassPathXmlAppcationContext 从类的路径读取配置文件
Spring配置详解
1. 配置bean元素
<!--
|
2.创建方式
<!--scope 对象的创建方式 默认是单例模式 |
一般情况下全都用默认的。
多例模式,在整合struts2的时候action必须使用多例模式
3. 生命周期的方法
在对象创建后马上就执行一个方法
对象销毁前执行一个方法
<bean name="user" class="cn.hd.text.User" id="user" init-method="init" destroy-method="destroy"></bean>
在User类中,书写init 和destroy方法
测试,可以手动的去销毁对象,调用ClassPathXmlApplicationContext的close
注意:销毁对象,这个对象必须是单例的,如果是多例的无法手动销毁
4.
Spring 创建对象的方式
(1)无参数的构造函数 (重点使用)
(2)静态工厂实例化 (了解)
<bean name="workersFactory" class="cn.hd.text.WorkersFactory" factory-method="createWorkers"></bean> |
并且创建一个UserFactory 该类提供了一个静态的creatUser方法
public static User createUser(){ Workers workers1 = (Workers) ac.getBean("workersFactory"); |
(3) 实例化工厂创建(了解)
<bean name="workersFactory1" class="cn.hd.text.WorkersFactory" ></bean> |
public User createUser1(){
Workers workers1 = (Workers) ac.getBean("workersFactory"); |
对象属性的注入
(1) set 注入(最重要的)
基本属性 8大基础类型+String
<bean name="car" class="cn.hd.injection.Car">
<property name="name" value="布加迪威龙"></property>
<property name="color" value="黑色"></property>
</bean>
name 类属性名 value 属性值
(2)引用属性 对象
<bean name="user" class="cn.hd.injection.User">
<property name="name" value="吕佳伟"></property>
<property name="age" value="21"></property>
<property name="address" value="河南"></property>
<property name="car" ref="car"></property>
</bean>
name 类的属性名 ref 引用的bean的name
(3)构造函数的注入
<bean name="user1" class="cn.hd.injection.User">
<constructor-arg name="name" value="张三" index="1" type="java.lang.String"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
<constructor-arg name="car" ref="car"></constructor-arg>
</bean>
name value(ref) index type
属性 具体的值 参数的位置 参数的类型
(3)p空间注入 (最简单)但是业界不认可<property>
导入约束
xmlns:p="http://www.springframework.org/schema/p"
http://www.springframework.org/schema/p
<bean name="user2" class="cn.hd.injection.User"
p:name="李四" p:age="20" p:car-ref="car">
</bean>
(4)spel注入类似于el和ognl表达式
<bean name="user3" class="cn.hd.injection.User">
<property name="name" value="#{user2.name}"></property>
<property name="car" value="#{car}"></property>
</bean>
复杂类型的注入
数组:
<bean name="collectionBean" class="cn.hd.injection.CollectionBean"> <!--数组中的元素只有一个那么它的配置和基本类型一样 --> 如果有多个数据 |
List/set
<!--List集合中只有一个元素配置和基本的一样-->
<bean name="collectionBean" class="cn.hd.injection.CollectionBean"> |
Map
键值对 key key-ref value value-ref Map<k,v>
<bean name="collectionBean" class="cn.hd.injection.CollectionBean"> <property name="map"> </bean> |
Properties
<property name="properties"> |
模块化
Src目录下
<import resource="classpath:applicationContext.xml"></import>
Resource 其他配置文件的地址
使用注解配置spring
1. 导包 4+2+1
aop
2. 导入约束文件
xmlns:context="http://www.springframework.org/schema/context" |
http://www.springframework.org/schema/context |
3. 指定扫描的包
<!--指定扫描的位置,自动扫描该包以及该包所有的子包--> <context:component-scan base-package="cn.hd.annotation"></context:component-scan>
4. 为类声明注解
在类上书写代码
@Component("user") //@Controller("user")//web层 //为了解决所有的bean都是同一个注解,导致层次不清淅,提出了三个新的注解 public class User { 相当于在.xml bean name=user class=cn.hd.annotationUser } |
没有强制要求,都可以用,提倡按照他的本意去注解
修改Scope属性
@Scope(scopeName = "prototype") singleton|prototype 单例(默认)和多例 |
属性注入:
(1) 值类型: 注解写在属性上面,同时也可以写在set方法上面
@Value("张三") |
(2) 引用类型:
// @Autowired //自动装配 如果只有一个对象 自动装配 private Car car; |
(3) 创建对象后就执行的方法
@PostConstruct |
Spring结合junit
1. 导包
test
2. 书写测试代码
@RunWith(SpringJUnit4ClassRunner.class)//结合junit测试 |
由于原来使用的是application对象,读取配置和获得bean对象
但是现在没有了 又想获得对象
@Resource(name="user") |