Spring框架基本知识点整理1

本文深入探讨Spring框架的Bean配置技巧,包括自动装配、继承、依赖及作用域配置,同时介绍如何利用外部属性文件和Spring表达式语言优化配置。

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

XML 配置里的 Bean 自动装配

1)Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 的 autowire 属性里指定自动装配的模式
2)byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
3)byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
4)constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用

XML 配置里的 Bean 自动装配的缺点

1)在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
2)autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
3)一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些

public class Person {
 private String name;
 private Address address;
 private Car car;}
 
public class Address {
 private String city;
 private String street;}
public class Car {
 private String brand;
 private double price;}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
 <bean id="address" class="com.atguigu.spring.beans.autowire.Address"
  p:city="Beijing" p:street="HuiLongGuan"></bean>
 <bean id="car" class="com.atguigu.spring.beans.autowire.Car"
  p:brand="Audi" p:price="3000"></bean>
 <bean id="person" class="com.atguigu.spring.beans.autowire.Person"
  p:name="Tom" autowire="byType"></bean>
  <!--
  <bean id="person" class="com.atguigu.spring.beans.autowire.Person"
  p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
-->
</beans>
public class Main {
 public static void main(String[] args) {
  ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  System.out.println((Person)ctx.getBean("person"));
 }
}

继承 Bean 配置

1.父 bean:被继承的 bean
2.子 Bean:继承这个父 Bean 的 Bean
3.子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
4.子 Bean 也可以覆盖从父 Bean 继承过来的配置
5.父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
6.并不是 元素里的所有属性都会被继承. 比如: autowire, abstract 等.
7.也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true
继承实例1

<bean id="address" class="com.atguigu.spring.beans.autowire.Address"
  p:city="Beijing" p:street="WuDaoKou"></bean>
 <bean id="address2" class="com.atguigu.spring.beans.autowire.Address"
  p:street="DaZhongSi" parent="address"></bean>

继承覆盖示例:city被覆盖

<bean id="address" class="com.atguigu.spring.beans.autowire.Address"
  p:city="Beijing" p:street="WuDaoKou"></bean>
 <bean id="address2" class="com.atguigu.spring.beans.autowire.Address"
  p:street="DaZhongSi" p:city="Beijing^" parent="address"></bean>

示例:父 Bean 可以作为配置模板

<bean id="address" class="com.atguigu.spring.beans.autowire.Address"
  p:city="Beijing" p:street="WuDaoKou" abstract="true"></bean>
 <bean id="address2" class="com.atguigu.spring.beans.autowire.Address"
  p:street="DaZhongSi" p:city="Beijing^" parent="address"></bean>

可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置.但此时 abstract 必须设为 true

<bean id="address" abstract="true"></bean>
 <bean id="address2" class="com.atguigu.spring.beans.autowire.Address"
  p:street="DaZhongSi" p:city="Beijing^" parent="address"></bean>

依赖 Bean 配置

1.Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
2.如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称

<bean id="car" class="com.atguigu.spring.beans.autowire.Car"
  p:brand="Audi" p:price="20000"></bean>
 <bean id="person" class="com.atguigu.spring.beans.autowire.Person"
  p:name="Tom" p:address-ref="address2" depends-on="car"></bean>

必须实现car的bean配置,否则报错,测试运行代码如下。

public static void main(String[] args) {
  ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-relation.xml");
  System.out.println((Address)ctx.getBean("address2"));
  System.out.println((Car)ctx.getBean("car"));
  System.out.println((Person)ctx.getBean("person"));
 }
Address [city=Beijing^, street=DaZhongSi]
Car [brand=Audi, price=20000.0]
Person [name=Tom, address=Address [city=Beijing^, street=DaZhongSi], car=null]

Bean 的作用域

1.默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.
2.在 Spring 中, 可以在 元素的 scope 属性里设置 Bean 的作用域.
在这里插入图片描述
测试代码示例1:

<bean id="car" class="com.atguigu.spring.beans.autowire.Car">
  <property name="brand" value="Audi"></property>
  <property name="price" value="30000"></property>
 </bean>
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-scope.xml");
System.out.println((Car)ctx.getBean("car")==(Car)ctx.getBean("car"));

运行结果:
true
修改配置文件:

<bean id="car" class="com.atguigu.spring.beans.autowire.Car"
  scope="prototype">
  <property name="brand" value="Audi"></property>
  <property name="price" value="30000"></property>
 </bean>

运行结果:false

使用外部属性文件

为了方便配置。‘
通过bean配置获得数据库连接。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="user" value="root"></property>
  <property name="password" value="stoneSml@123"></property>
  <property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
  <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/webdemo?useSSL=false&amp;serverTimezone=UTC"></property>
 </bean>
</beans>

测试代码:

public static void main(String[] args) {
  ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-property.xml");
  System.out.println((DataSource)ctx.getBean("dataSource"));
 }

方法二:
在配置信息文件db.properties中做如下配置:

user=root
password=stoneSml@123
driverClass=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/webdemo?useSSL=false&amp;serverTimezone=UTC

xml中的配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 <context:property-placeholder location="classpath:db.properties"/>
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="user" value="${user}"></property>
  <property name="password" value="${password}"></property>
  <property name="driverClass" value="${driverClass}"></property>
  <property name="jdbcUrl" value="${jdbcUrl}"></property>
 </bean>
</beans>

1.在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离
2.Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
3.Spring 还允许在属性文件中使用 ${propName},以实现属性之间的相互引用。

Spring表达式语言:SpEL

详细链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值