Spring基本概念和Bean的操作
Spring概念
1、Spring是一个开源的框架。
2、Spring可以师简单的JavaBean实现以前只有EJB才能实现的功能。
3、Spring是一个IOC容器框架。
4、Spring 是java/javaee 一站式框架
Spring特点
1、轻量级
2、依赖注入
3、面向切面编程
4、容器
5、一站式
※Spring 所需jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
IOC以及Bean的配置
什么是IOC?
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”。
用更通俗的话来说,IoC就是指对象的创建,并不是在代码中用new操作new出来的,而是通过Spring进行配置创建的。
IoC能做什么?
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
如何配置Bean
我们可以在applicatonContext.xml中通过bean节点来配置bean.
例如:
<bean id="daughter" class="spring.ioc.com.factory.Daughter" />
<bean id="son" class="spring.ioc.com.factory.Son" />
※Bean的属性ID
1、在 IOC 容器中必须是唯一的
2、若 id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字
3、id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔
Bean的作用域
Spring提供了4种作用域,它会根据情况决定是否生成新的对象。
单例(singleton):它是默认选项,整个应用中Spring只生成一个Bean的实例;
原型(prototype):每次注入或者通过SpringIoc容器获取Bean时,Spring都会为它创建一个新实例;
会话(session) :一个Session中,Spring只会创建一个实例;
请求(request) :一次请求中Spring会创建一个实例,不同的请求会创建不同的实例。
Spring IOC可以管理Bean的生命周期,其过程为
- 通过构造或工厂方法创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 调用 Bean 的初始化方法
- 使用Bean
- 当容器关闭时,调用Bean的销毁方法
※Bean的注入依赖方式
1、属性注入
- 属性输入即通过setter方法注入Bean的属性或依赖的对象
- 属性注入 < property>元素,使用name属性指定Bean的属性名称,value属性或< value> 子节指定属性值。
示例:
<bean id="userService" class="com.zzxt.springboot.ioc.di.UserService">
<property name="udao" ref="userDao"></property>
<property name="userName" value="Tom" ></property>
同理:
可以使用<property name="userName"><value>Tom</value></property>
<property name="age" value="21"></property>
<property name="whight" value="90.5"></property>
</bean>
步骤如下:
1、在目标bean类文件中将属性生成setter方法
2、在spring配置文件中配置目标bean的属性依赖,通过标签标签property name属性表示bean的属性名,使用 value配置属性值,(当值为引用类型需要使用ref属性)
2、构造器注入
- 通过构造方法注入Bean的属性值或依赖的对象,他保证了Bean实例在实例化后就能够使用。
- 构造器注入在< constructor-arg>元素里声明属性。
方法如下:
1、按照参数的顺序,需要使用属性index, index从0开始
<bean id="userService" class="com.zzxt.springboot.ioc.di.UserService">
<constructor-arg index="0" ref="userDao"></constructor-arg>
<constructor-arg index="1" value="19"></constructor-arg>
<constructor-arg index="2" value="23.7"></constructor-arg>
<constructor-arg index="3" value="老王"></constructor-arg>
</bean>
2、按照参数类型的顺序,进行注入:使用属性type,基本数据类型直接写类型名称
<bean id="userService" class="com.zzxt.springboot.ioc.di.UserService">
<constructor-arg type="com.zzxt.springboot.ioc.di.UserDao" ref="userDao"></constructor-arg>
<constructor-arg type="int" value="21"></constructor-arg>
<constructor-arg type="double" value="21.0"></constructor-arg>
<constructor-arg type="String" value="老王"></constructor-arg>
</bean>
注:注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
Bean是可继承的
<!-- bean可以有继承关系 -->
<bean id="userDao" class="com.zzxt.springboot.ioc.di.UserDao">
<property name="userName" value="Tom"></property>
<property name="dbName" value="mysql"></property>
</bean>
<bean id="subUserDao" parent="userDao">
<property name="dbName" value="zero"></property>
</bean>
可以设置内置Bean
<!-- 可设置内置bean
<bean id="userService" class="com.zzxt.springboot.ioc.di.UserService">
<property name="apple">
<bean class="com.zzxt.springboot.ioc.di.Apple"></bean>
</property>
</bean>
-->