JAVA零基础学习(SSM框架)——Spring

Spring是一个轻量级的容器,核心特性包括控制反转IoC和面向切面编程AOP,用于降低代码耦合度。IoC通过容器管理对象及其依赖关系,实现对象的创建和注入。依赖注入DI则是IoC的一种实现方式,通过setter方法或构造器注入对象。文章还介绍了基于XML和注解的IoC配置,以及bean的生命周期和自动装配。

初识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中的过程称为自动装配

自动装配方式:

按类型(通用)

按名称

按构造方法

不启用自动装配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值