初识Spring
什么是Spring框架
它是一个容器,它是整合其它框架的框架
Spring的核心
控制反转(IoC)和面向切面编程(AOP)
Spring主要作用
为代码“解耦”,降低代码的解耦度
Spring的优点
a.轻量级:二十多个模块构成,每个jar包小,对代码无污染
b.面向接口编程:使用接口,就是面向灵活,项目的扩展性,可维护性都极高。使用接口指向实现类,切换实现类即可切换整个功能
c.AOP(面向切面编程):就是将公共的,通用的,重复的代码单独开发,在需要的时候反织回去,底层的原理是动态代理
d.整合其它框架:它整合后使其它框架更易用
1.简化开发
IoC
AOP
事务处理
2.框架整合
MyBatis
MyBatis-plus
Struts
Sruts2
Hibernate
...
IoC
核心概念
IoC控制反转:
正转:由程序员进行对象的创建和依赖注入称为正转。程序员说的算
反转:由Spring容器创建对象和注入依赖称为反转。将控制权从程序员手中夺走,由给Spring容器,称为反转。容器说的算
使用对象时,由主动new产生对象转化为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想成为控制反转
Spring技术对IoC思想进行了实现:
Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
IoC容器负责对象的创建,初始化等一系列工作,被创建或管理的对象在IoC容器中被称为Bean
DI依赖注入:
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
目标:充分解耦
使用IoC容器管理bean(IoC)
在IoC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果
使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
IoC入门案例思路分析
1.管理什么?
(Service与Dao)
2.如何将管理的对象告知IoC容器?
(配置)
3.被管理的对象交给IoC容器,如何获取到IoC容器?
(接口)
4.IoC容器得到后,如何从容器中获取bean?
(接口方法)
5.使用Spring导入那些坐标?
(pom.xml)
什么是IoC
IoC(控制反转)就是将程序中原来 new 对象,交给spring创建,从spring工厂获取对象,使用spring来负责控制对象的生命周期和对象间的关系.**这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
基于xml的IOC
1.创建对象
<bean id ="stu" class="com.feisi.pojo.Student"></bean>
2.给创建的对象赋值
A.使用setter注入
注入分为简单类型注入和引用类型注入
简单类型注入值使用value属性
引用类型注入值使用ref属性
必须要注意:使用setter注入必须提供无参的构造方法,必须提供setxxx()方法
<!--创建学生对象--> <bean id="stu" class="com.feisi.pojo2.student"> <property name="name" value="李四"></proerty> //简单类型注入 <property name="age" value="22"></proerty> <property name="school" ref="school"></proerty> //引用类型注入 </bean> <!--创建学校对象--> <bean id="school" class="com.feisi.pojo2.school"> <property name="name" value="清华大学"></proerty> //简单类型注入 <property name="address" value="海定区"></proerty> //引用类型注入 </bean>
B.使用构造方法注入
Student stu = new Student("张三",22)
a.使用构造方法的参数名称进行注入值
<bean id="school" class="com.feisi.pojo.School"> <constructor-arg name="name" value="清华大学"></constructor-arg> <constructor-arg name="address" value="海定区"></constructor-arg> </bean>
b.使用构造方法参数的下表注入值
<bean id="stu" class="com.feisi.pojo.Sudent"> <constructor-arg index="0" value="小七"/> <constructor-arg index="1" value="22"/> <constructor-arg index="2" ref="school"/> </bean>
c.使用默认的构造方法的参数的顺序注入值
DI
DI的理解(基于注解的IOC)
DI(Dependency Injection)即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:
-
谁依赖于谁:当然是应用程序依赖于IoC容器;
-
为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
-
谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
-
注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢?Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
IoC和DI是什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在spring的框架中堆积木而已。
1.创建对象的注解
@Component:可以创建任意对象
@Controller:专门用来创建控制器的对象(Servlet),这种对象可以接收用户的请求,可以返回处理结果给客户端
@Service:专门用来创建业务层逻辑层的对象,负责向下访问数据访问层,处理完毕后的结果返回给界面层
2.依赖注入的注解
值类型的注入
@Value:用来给简单类型注入值
引用类型的注入
A:@Autowired:使用类型注入值,从整个Bean工厂中搜索同源类型的对象进行注入
B:@Autowired
@Qualifier:使用名称注入值,从整个Bean工厂中搜索相同名称的对象进行注入
bean实例化
构造方法实例化bean(常用)
构造方法:
public class BookDaoImpl implements BookDao {
public void save(){
System.out.println("book dao save ...");
}
}
配置:
<bean id="bookDao" class="com.feisi.dao.impl.BookDaoImpl"/>
使用静态工厂实例化bean
静态工厂:
public class OrderDaoFactory{
public static OrderDao getOrderDao(){
return new OrderDaoImpl();
}
}
配置:
<dean id ="orderDao" class="com.feisi.dao.factory.OrderDaoFactory" factory- method="getOrderDao"/>
使用实例工厂实例化bean
实例工厂:
配置:
<bean id="userFactory" class="com.feisi.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
使用FactoryBean实例化bean(常用)
FactoryBean:
public class UserDaoFactoryBean implements FactoryBean<UserDao>{
public UserDao getObject() throws Exception{
return new UserDaoImpl();
}
public Class<?> getObjectType(){
return UserDao.class;
}
}
配置:
<dean id="userDao" class="com.feisi.factory.UserqDaoFactoryBean"/>
bean生命周期
提供生命周期控制方法
public class BookDaoImpl implements BookDao{
public void save(){
System.out.println("book dao save...")
public void init(){
System.out.println("book init...")
public void destory(){
System.out.println("book destory...")
}
}
配置生命周期控制方法
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory">
init-method="init"
destroy-method="destory">
bean经历了哪些阶段
初始化容器
1.创建对象(内存分配)
2.执行结构方法
3.执行属性注入(set操作)
4.执行bean初始化方法
使用bean
1.执行业务操作
关闭/销毁容器
1.执行bean销毁方法
手工关闭容器:
ConfigurableApplicationContext接口close()操作
注册关闭钩子,在虚拟机推出前先关闭容器再退出虚拟机:
ConfigurableApplicationContext接口registerShutdownHook()操作
依赖注入
依赖注入方式
setter注入
简单类型
引用类型
构造器注入
简单类型
引用类型
依赖注入方式选择
1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
2.可选依赖使用setter注入进行,灵活性强
3.Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入
依赖自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式:
按类型(通用)
按名称
按构造方法
不启用自动装配
Spring是一个轻量级的容器,核心特性包括控制反转IoC和面向切面编程AOP,用于降低代码耦合度。IoC通过容器管理对象及其依赖关系,实现对象的创建和注入。依赖注入DI则是IoC的一种实现方式,通过setter方法或构造器注入对象。文章还介绍了基于XML和注解的IoC配置,以及bean的生命周期和自动装配。
——Spring&spm=1001.2101.3001.5002&articleId=132014934&d=1&t=3&u=1903a0deebc44a69a2feb34e29fd9a5c)
1513

被折叠的 条评论
为什么被折叠?



