Java框架知识点总结第二篇——spring

本文深入探讨Spring框架,详细介绍了其优点、体系结构,特别是依赖注入(DI)的概念,包括构造函数注入和set方法注入,以及注解在Spring中的应用,如@Component、@Service、@Controller等,旨在帮助读者理解Spring如何管理bean的生命周期和降低程序耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,spring

1,spring的优点

(1)方便解耦,简化开发。
(2)AOP编程的支持
(3)声明式事务的支持
(4)方便程序的支持
(5)方便集成各种优秀框架
(6)降低Java EE API的使用难度
(7)Java源码是经典的学习范例。

2,spring的体系结构

(1)IoC
spring核心模块实现了IoC的功能,它将类与类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IoC容器负责依赖类之间的创建、拼接、管理、获取等工作。BeanFactory接口是spring框架的核心接口,它实现了容器许多核心的功能。
Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了i18n国际化、Bean生命周期控制、框架事件体系等功能。
(2)AOP
AOP是进行横切逻辑编程的思想,它开拓了考虑问题的思路。
(3)数据访问与集成
(4)Web及远程操作
(5)Web及远程访问
(6)WebSocket

一,程序的耦合

耦合:程序间的依赖关系
耦合包括:
(1)类之间的依赖
(2)方法见的依赖
解耦:降低程序间的耦合关系
实际开发中:应该做到,编译器不依赖,运行时依赖
解耦的思路:
第一步:使用反射来创建对象,而避免使用new关键字
第二步:通过读取配置文件来获取要创建的对象全限定类名

二,beanfactory

beanfactory:一个创建bean对象的工厂

bean:在计算机英语中,有可重用组件的含义
javabean:用java语言编写的可重用组件。

它就是用于创建service和dao对象的

第一步:需要一个配置文件来配置我们的service和dao
配置的内容:唯一标识 = 全限定类名(key = value)
第二步:通过读取配置文件中配置的内容,反射创建对象
配置文件可以是xml也可以是properties

三,IOC

IOC就是控制反转,控制反转把创建对象的权利交给框架,是框架的重要特征。

四,获取spring的ioc核心容器并根据id获取对象

ApplicationContext的三个常用实现类:
ClassPathXmlApplicationContext 它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。
FileSystemXmlApplicationContext 它可以加载磁盘任意路径下的配置文件(必须有访问权限)
AnnotationConfigAoolicationContext 它是用于读取注解创建容器的。

核心容器的两个接口引发的问题:
ApplicationContext: (单例对象使用)
它在构建容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件就马上创建配置文件的配置对象
BeanFactory: (多例对象使用)
它在创建核心容器时,创建对象采取的策略是延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象

五,把对象的创建交给spring来管理

spring对bean的管理细节
1,创建bean的三种方式
2,bean对象的作用范围
3,bean对象的生命周期

1,创建bean的三种方式

第一种方式:使用默认构造函数创建。
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。

<bean id="accountService" class="com.star.service.impl.AccountServiceImpl"></bean>

第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)

<bean id="instanceFactory" class="com.star.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

第三种方式:使用工厂中的静态方法创建对象(使用某个类的静态方法创建对象,并存入spring容器)

<bean id="accountService" class="com.star.factory.StaticFactory" factory-method="getAccountService"></bean>

2,bean的作用范围调整

bean标签的scope属性:
作用:用于指定bean的作用范围
取值:

  • singleton(单例的 也是默认值)
  • prototype(多例的)
  • request(作用于web应用的请求范围)
  • session(作用于web应用的会话范围)
  • global-session(作用于集群环境的会话范围(全局会话范围),当不是集群环境时,他就是session)

六,spring中的依赖注入(Dependency Injection)

IOC的作用: 降低程序之间的耦合

依赖关系的管理:都交给spring来维护
在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
依赖关系的维护:就称之为依赖注入

依赖注入能注入的数据有三类:

  • 基本数据类型和string类
  • 其他bean类型(在配置文件中或者注解配置过的bean)
  • 复杂类型/集合类型

注入的方式有三种:

  • 使用构造函数提供
  • 使用set方法提供
  • 使用注解提供

七,构造函数的注入

(1)使用的标签:
		constructor-arg
(2)标签出现的位置:
		bean标签的内部
(3)标签中间的属性:
  • type:用于指定要注入的数据的类型,该数据类型也是构造函数中某个或某些参数的类型
  • index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置从0开始
  • name:用于指定给构造函数中指定名称的参数赋值

以上三个用于指定给构造函数中哪个参数赋值

  • value:用于给基本类型或string类型的提供数据
  • ref:用于指定其他的bean类型数据。它指的就是在spring的ioc核心容器中出现过的bean对象
(4)优势与弊端

优势:在获取bean对象时,注入数据时必须的操作,否则对象无法创建成功
弊端:改变了对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供

<bean id="accountService" class="com.star.service.impl.AccountServiceImpl" scope="prototype">
        <constructor-arg name="name" value="test"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<!--构造一个日期对象-->
<bean id="now" class="java.util.Date"></bean>

八,set方法注入(更为常用)

(1)涉及的标签:
		property
(2)出现的位置:
		bean标签的内部	
(3)标签的属性:
  • name:用于指定给构造函数中指定名称的参数赋值
  • value:用于给基本类型或string类型的提供数据
  • ref:用于指定其他的bean类型数据。它指的就是在spring的ioc核心容器中出现过的bean对象
(4)优势与弊端

优势:创建对象时没有明确的限制,可以直接使用默认的构造函数
弊端:如果有某个成员必须有值,则获取对象时有可能set方法没有执行

(5)复杂类型的注入/集合类型的注入
用于给List结构集合注入的标签:list array set

用于给map结构集合注入的标签:map props

结构相同 标签可以互换
<bean id="accountService2" class="com.star.service.impl.AccountServiceImpl2">
        <property name="age" value="19"></property>
        <property name="birthday" ref="now"></property>
        <property name="name" value="刘星"></property>
</bean>

九,注解

注解的作用就和xml配置文件中编写一个be’an标签实现的功能是一样的

(1)注解的分类
@Component:
作用:用于把当前类对象存入spring容器中

属性:
	value:用于指定bean的id,当我们不写时,它的默认值是当前类名,且首字母改小写
@Service 一般用在业务层
@Controler 一般用在表现层
@Repository 一般用在持久层

以上三个注解他们的作用和属性与component是一模一样,他们三个是spring框架为我们提供的明确的三层使用的注解,使我们的三层对象更加清晰

(2)用于注入数据的注解

他们的作用就和xml配置文件中的bean标签中写一个property的作用是一样的
@Autowired:

  • 作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
  • 如果ioc容器中没有任何bean的类型和要注入的类型匹配,则报错。
  • 如果ioc容器中有多个类型匹配时,则根据变量名匹配id,匹配不到则报错
  • 出现位置:可以是变量上,也可以是方法上
  • 细节:在使用注解注入时,set方法就不是必须的了

@Qualifier:

  • 作用:在按照类中注入的基础上再按照名称注入,他在给类成员注入时不能单独使用,但是在给方法参数注入时可以
  • 属性:value:用于指定注入bean的id

@Resource

  • 作用:直接按照bean的id注入。它可以独立使用
  • 属性:name:用于指定bean的id

以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现;
另外,集合类型的注入只能通过xml实现

@Value

  • 作用:用于注入基本类型和String类型的数据
  • 属性:value:用于指定数据的值。它可以使用spring中的SpEL(也就是spring的el表达式)
(3)用于改变作用范围的注解

他们的作用就和xml配置文件中的bean标签中使用scope属性实现的功能是一样的
@Scope

  • 作用:用于指定bean的作用范围
  • 属性:value:指定范围的取值。常用取值:singleton prototype
(4) 和生命周期相关的注解

他们的作用就和bean标签中使用init-method和destroy-method的作用是一样的
@PreDestroy

  • 作用:用于指定销毁方法

@PostConstruct

  • 作用:用于指定初始化方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值