大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!死鬼~看完记得给我来个三连哦!
本文主要介绍
Spring 中的核心之一 IOC
如有需要,可以参考 如有帮助,不忘 点赞 ❥
在这里插入图片描述
一个典型的 Spring 项目需要创建一个或多个 Bean 配置文件, 这些配置文件用于在 Spring IOC 容器里配置 Bean. Bean 的配置文件可以放在 classpath 下, 也可以放在其它目录下.
在这里插入图片描述
public class Person {
private String name;
public Person() {
System.out.println("Person's constructor...");
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Person person = new Person();
person.setName("Cbuc");
person.hello();
/**
* class: 通过全类名的方式配置Bean
* id:Bean的名称;
* - 在 IOC 容器中必须是惟一的;
* - 若 id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字
* - id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔
*/
/**
* 依赖注入的方式
* 1)属性注入
* 2)构造器注入
* 3)工厂方法注入(很少使用,不推荐)
*/
<!-- 通过 setter 方法注入属性值 -->
<bean id="person1" class="cbuc.life.test_01.Person">
<!-- 为属性赋值 -->
<!-- 通过属性注入: 通过 setter 方法注入属性值 -->
<property name="name" value="Cbuc"></property>
</bean>
<!-- 通过构造器注入属性值 -->
<bean id="person2" class="cbuc.life.test_01.Person">
<!-- 要求: 在 Bean 中必须有对应的构造器. -->
<constructor-arg value="Cbuc"></constructor-arg>
</bean>
/**
* 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.
* Spring 提供了两种类型的 IOC 容器实现.
* 1)BeanFactory: IOC 容器的基本实现.
* 2)ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
* BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
*/
//1. Spring 装配 IOC
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//2. 通过 IOC 获取 bean "person1" 通过指定ID的方式
Person person = (Person) ctx.getBean("Person2");
//通过指定类型的方式,弊端:如果IOC中配置了多个Person类,那么将会不知道为你注入那个Bean
//Person perosn1 = ctx.getBean(Person.class);
场景1: 当一个类中有两个构造方法
new Person("Cbuc",22,"男"):我想使用的是第二个构造方法给age赋值,但是却进入到了第一个构造方法中,为salary赋值.
解决: 按类型匹配入参
成功为age赋值:
场景2: 当一个类中有个构造方法
bean注入属性的时候没有按照构造方法的顺序注入
那么获得Bean的时候成功报错
解决: 按索引匹配入参
<value>
元素标签或 value 属性
进行注入。字面值注入
的方式<![CDATA[]]>
把字面值包裹起来。<bean id="person4" class="cbuc.life.test_01.Person">
<property name="name">
<!-- 若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值 -->
<value><![CDATA[<Cbuc>]]></value>
</property>
<property name="age" value="22"></property>
<property name="gender" value="1"></property>
</bean>
场景: Person 中需要一个 Car 类
解决:
首先在IOC中注入Car:
<bean id="Mycar" class="cbuc.life.test_01.Car">
<property name="maxSpeed" value="220"></property>
<property name="price" value="200000"></property>
<property name="brand" value="WEY"></property>
</bean>
方法一: 通过 ref 在person中引用:
方法二: 内部Bean(注意内部Bean只能当前Bean使用,外部不能引用!)
List
Map
Set与List用法一致
属性集合
数组
byType
(根据类型自动装配):
若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.byName
(根据名称自动装配):必须将目标 Bean 的名称和属性名设置的完全相同.
Constructor
(通过构造器自动装配) :不推荐使用配置模板
, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置的abstract
属性为 true, 这样 Spring 将不会实例化这个 Bean
autowire
,abstract
等.depends-on
属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
PropertyPlaceholderConfigurer
的 BeanFactory
后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var}
的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
通过 SpEL 可以实现:
<property name="count" value="#{5}"/>
<property name="frequency" value="#{89.7}"/>
<property name="capacity" value="#{1e4}"/>
<property name="name" value="#{'Chuck'}"/>
<property name='name' value='#{"Chuck"}'/>
<property name="enabled" value="#{false}"/>
component scanning
): Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件.<context:component-scan>
看完不赞,就是坏蛋
本文较长,能看到这里的都是好样的,成长之路学无止境 今天的你多努力一点,明天的你就能少说一句求人的话!