6.3.3、P和C的区别
-
相同点
-
都要在头文件中加入约束
-
都可以对属性注入
-
不同点
-
P 为属性简称,不需要有参构造器,相当于Set方法注入
-
C 为构造器简称,必须要有参构造器,相当于构造器注入
6.4、Bean的作用域
| 类别 | 说明 |
| — | — |
| singleton | 单例模式。使用 singleton 定义的 Bean 在 Spring 容器中只有一个实例,这也是 Bean 默认的作用域 |
| prototype | 原型模式,或多例模式。每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例。 |
| request | 在一次 HTTP 请求中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Request 内有效。 |
| session | 在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Session 内有效。 |
| global session | 在一个全局的 HTTP Session 中,容器会返回该 Bean 的同一个实例。该作用域仅在使用 portlet context 时有效。 |
| websocket | websocket是一种应用层的通信协议,它提供应用层的全双工通信。若一个bean的作用域为websocket,则只作用于一次websocket通信,若连接被释放,则bean自然也会被销毁。 |
6.4.1、singleton
singleton(单例)是Spring中bean默认的作用域。若一个bean的作用域是单例的,那么每个IoC容器只会创建这个bean的一个实例对象。所有对这个bean的依赖,以及获取这个bean的代码,拿到的都是同一个bean实例。Spring容器在创建这个bean后,会将它缓存在容器中(实际上是放在一个ConcurrentHashMap中)。Spring中的单例bean不是线程安全的,所以只有在我们只关注bean能够提供的功能,而不在意它的状态(属性)时,才应该使用这个作用域。
ServiceImpl_1、ServiceImpl_2 是同一个类的两个不同的对象,并且都是单例的
6.4.2、prototype
prototype可以理解为多例。若一个bean的作用域是prototype,那么Spring容器并不会缓存创建的bean,程序中对这个bean的每一次获取,容器都会重新实例化一个bean对象。通常,如果我们需要使用bean的状态(属性),且这个状态是会改变的,那么我们就可以将它配置为这个作用域,以解决线程安全的问题。因为对于单例bean来说,多个线程共享它的可变属性,会存在线程安全问题。
7、Bean的装配(注入)
=============
7.1、场景
Cat.java
public class Cat {
public void shout(){
System.out.println(“猫叫:喵喵~~~”);
}
}
Dog.java
public class Dog {
public void shout(){
System.out.println(“狗叫:汪汪~~~”);
}
}
User.java
public class User {
private Cat cat;
private Dog dog;
private String 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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
beans.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
测试
public class MyTest {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
User user = context.getBean(“user”, User.class);
System.out.println(“我是”+user.getName()+“,我的宠物”);
user.getCat().shout();
user.getDog().shout();
}
}
7.2、xml中手动配置
必须要有set方法
7.3、xml中自动装配autowire
必须要有set方法
7.3.1、byName自动装配
需要装配的bean的名称,必须和set方法后面的名称一致。
bean的id,name,alias别名中有一个和set方法后的名称一致即可
如 id=“cat” ,
id=“cat111” name=“cat cat222 , cat333 ; cat444”
alias name=“cat2” alias=“cat”
setCat()
7.3.2、byType自动装配
只要bean的类型一致就可以。id、name、alias即使没有也可以。
使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。
如果不唯一,会报不唯一的异常。
NoUniqueBeanDefinitionException
7.4、在类中用注解自动装配
jdk1.5开始支持注解,spring2.5开始全面支持注解。
7.4.1、准备工作
- 在beans配置文件中引入context文件头
xmlns:context=“http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd


- 开启注解支持!
context:annotation-config/
7.4.2、@Autowired
-
@Autowired 是属于spring规范
-
@Autowired是按类型自动装配的,不支持名称匹配
-
如果要按名称匹配,需加上@Qualifier
-
可以省略set方法。前提是这个自动装配的属性在IOC容器中存在,且符合名字byName
-
不建议使用字段注入。应在set方法上注入。

- 在spring4之后,想要使用注解形式,必须得要引入aop的包

测试
将User类中的set方法去掉,使用@Autowired注解
public class User {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
public Dog getDog() {
return dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
beans.xml
因为是按类型装配的,所以被装配的bean(如Cat、Dog)可以省去id
context:annotation-config/
测试通过

注:
- @Autowired(required=false) 说明:false,对象可以为null;true,必须存对象,不能为null。
//如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;
-
@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
-
@Qualifier不能单独使用。
@Autowired
@Qualifier(value = “cat2”)
private Cat cat;
@Autowired
@Qualifier(value = “dog2”)
private Dog dog;



@Nullable 如果字段标记了这个注解,说明这个字段可以是null
7.4.3、@Resource
-
@Resource 是属于J2EE规范
-
@Resource先按该属性进行byName方式查找装配;
-
其次再进行默认的byName方式进行装配;
-
如果以上都不成功,则按byType的方式自动装配。
-
都不成功,则报异常。
public class User {
@Resource(name = “cat2”)
private Cat cat;
@Resource
private Dog dog;
private String str;
}
7.4.4、@Autowired与@Resource比较
-
相同点
-
都是注解方式注入对象,即装配bean
-
都可以写在字段上,或写在set方法上
-
set方法可省略
-
两种方式如果都显式的指定按名称装配,就只会按名称进行装配,装配不成功就直接报错。【@Autowired中@Qualifier(value = “cat2”)、@Resource(name=“cat2”)】
-
不同点
-
@Autowired 属于spring规范
-
@Resource 属于J2EE规范
-
@Autowired 默认按类型byType装配
默认情况下必须要求依赖对象存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
- @Resource 默认按名称byName装配,如果找不到名称,就按类型byType装配
名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。
7.4.5、注解开发基本流程
要实现bean的自动配置,需要
-
先配置包的自动扫描
-
在bean类中加@Component注解,(或者衍生注解:@Controller、@Service、@Repository)
7.4.5.1、配置要扫描的包
context:annotation-config/
<context:component-scan base-package=“com.ajun.pojo”/>
7.4.5.2、添加注解@Component
<
最低0.47元/天 解锁文章
436

被折叠的 条评论
为什么被折叠?



