一:Spring配置
1、别名
<!--别名,如果添加了别名,我们也可以使用别名来获取这个对象-->
<alias name="user" alias="user_plus"/>
2、Bean的配置
- id:bean的唯一标识符,也就是相当于 对象名称
- class:bean对象所对应的全限定类名,-> 包名+ 类名
- name:也是别名的意思,但是这个比较高级,可以同时取多个别名 (中间可用空格,逗号等符合隔开)
<bean id="user" class="com.csnz.pojo.User" name="user_high user_anotherName">
<!--使用无参构造创建对象-->
<property name="name" value="潮汕奴仔"/>
</bean>
3、import
这个import,一般用于团队开发使用,作用是:将多个配置文件,导入合并为一个
使用的时候,直接使用总的配置就可以了
二:Bean标签
作用:
用于配置对象让 spring 来创建的。
默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
属性:
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。
-
singleton :默认值,单例的.
-
prototype :原型模式,(多例的.),每次从容器中get的时候,都会产生一个新对象
- request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
- session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
- application :将单个bean定义作用于ServletContext的生命周期。
仅在web感知的Spring ApplicationContext上下文中有效。 - websocket:将单个bean定义作用于WebSocket的生命周期。
仅在web感知的Spring ApplicationContext上下文中有效
init-method:指定类中的初始化方法名称。
destroy-method:指定类中销毁方法名称。
三:Bean的作用域及生命周期
单例对象:scope=“singleton”
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象:scope=“prototype”
每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了
四:Bean的自动装配
自动装配是Spring满足bean依赖的一种方式
Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种装配的方式
测试 在XML中显式的配置
cat类
public class Cat {
public void call(){
System.out.println("喵呜 ~ ~");
}
}
dog类
public class Dog {
public void call(){
System.out.println("汪汪 ~ ~");
}
}
person类
public class Person {
private String name;
private Cat cat;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
application-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.csnz.pojo.Person">
<property name="name" value="潮汕奴仔"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
<bean id="cat" class="com.csnz.pojo.Cat"/>
<bean id="dog" class="com.csnz.pojo.Dog"/>
</beans>
测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
Person person = context.getBean("person",Person.class);
person.getCat().call();
person.getDog().call();
}
测试自动装配
ByName自动装配
<!--
byName:会自动在容器上下文中查找,和自己对象set方法 后面的名称(首字母小写) 对应的 BeanId
-->
<bean id="person" class="com.csnz.pojo.Person" autowire="byName">
<property name="name" value="潮汕奴仔"/>
<!-- <property name="cat" ref="cat"/>-->
<!-- <property name="dog" ref="dog"/>-->
</bean>
<bean id="cat" class="com.csnz.pojo.Cat"/>
<bean id="dog" class="com.csnz.pojo.Dog"/>
ByType自动装配
<!--
byName:会自动在容器上下文中查找,和自己对象set方法 后面的名称(首字母小写) 对应的 BeanId
byType:会自动在容器上下文中查找,和自己对象属性具有相同类型 的 Bean (约束,保证类型全局唯一)
-->
<bean id="person" class="com.csnz.pojo.Person" autowire="byType">
<property name="name" value="潮汕奴仔"/>
<!-- <property name="cat" ref="cat"/>-->
<!-- <property name="dog" ref="dog"/>-->
</bean>
<bean id="cat" class="com.csnz.pojo.Cat"/>
<bean id="dog" class="com.csnz.pojo.Dog"/>
总结:
ByName的时候
需要保证所有bean的 id 唯一
并且这个 bean 需要和自动注入的属性的 set方法后面的名称(首字母小写) 的值一致
ByType的时候
需要保证所有bean的 class 唯一,并且这个bean 需要和自动注入的 属性的类型一致
五:使用注解实现自动装配
实现步骤:
- 导入约束:context 约束
<?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.xsd">
<context:annotation-config/>
</beans>
-
配置注解的支持:
<context:annotation-config/>
-
在要注入的属性上使用@Autowired注入
@Autowired注解
自动按照类型注入。当使用注解注入属性时,set 方法可以省略,前提是 自动装配的属性 在IOC容器中存在,且符合命名规范(ByName)。它只能注入其他 bean 类型。
当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
直接在属性上使用即可,也可以在set方法上使用。
@Nullable注解
字段标记了这个注解,说明这个字段可以为null
或 定义Autowired的required属性为false,说明这个对象可以为null,否则不允许为空
@Qualifier注解
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
如果使用 @Autowired注解 进行自动装配的时候 无法准确定位到某个bean的话,可以使用 @Qualifier(value=“xxx”)搭配 @Autowired注解 ,指定一个唯一的 bean 对象 注入
属性:
value:指定 bean 的 id。
测试
当出现多个cat类型 并且bean 的id 稀奇古怪时
会报如下错误!
No qualifying bean of type ‘com.csnz.pojo.Cat’ available: expected single matching bean but found 2: cat555,cat666
解决方法:需使用 @Qualifier 注解
而当出现如下情况时 无需配置 @Qualifier注解
因为 @Autowired 会先根据 类型 查看 发现不为一 根据 命名规范查看 发现 dog 这个bean
@Resource注解
直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
和 @Autowired注解差不多 功能比@Autowired完善一点点
属性:
name:指定 bean 的 id
小结:
@Resource 和 @Autowired 的区别
-
都是用来 实现 自动装配的,都可以放在属性字段上
-
@Autowired 默认通过 byType方式 实现,如果有多个类型相同,则根据命名规范找对象(byName) 这个对象必须存在(在XML中注册)不然使用Autowired注解直接爆红
-
@Resource 默认通过 byName方式实现,如果找不到名字,则通过byType实现,如果两个都找不到的情况下,就报错
总而言之,他们俩的执行顺序不同,@Autowired 默认通过 byType方式 实现, @Resource 默认通过 byName方式实现。