Spring框架---day05

Spring框架—day05

spring的5种自动装配方式

在spring中有一个配置文件中的元素有一个属性 autowire=“default” ,他是负责进行自动装配(bean中的属性的),可以省去很多的配置,代码就比较简单化,并且美观,但是也有副作用,一旦使用自动装配,就不会读取xml文件中的关于bean的属性。

1.No

No—默认的就是不自动装配,通过ref进行手工方式进行引入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpklySUe-1612785198506)(C:\Users\Administrator\Desktop\1\2-8.1.png)]

2.ByName

ByName—通过属性的名字进行自动装配,如果一个bean中的name和另一个bean中需要的名字一样了,就自动装配进去

@resources的注解就使用这个byname自动装配

如果你的名字和你的属性的名字不对应的时候, 就是一个错误。

实体类

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Teacher {
	public int id;
	public String name;
	public String password;
}



@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
	public int stuid;
	public String stuname;
	public Teacher teacher;
}

测试

public static void main(String[] args) {
		ApplicationContext app=new ClassPathXmlApplicationContext("beanParent.xml");
		Student student=app.getBean("student", Student.class);
		System.out.println(student.stuid+"\t"+student.stuname+"\t"+student.getTeacher().getName());
	}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7Ldqvaj-1612785198513)(C:\Users\Administrator\Desktop\1\2-8.2.png)]

3.ByType

ByType—通过属性的property自动装配

再student类中有一个属性为teacher,我们设置为根据类型找,它就会再xml文件中找对应的teacher类型的类,然后通过set方法注入。

@Autowired—这个注解本质就是通过类型找

如果在你的配置文件上有类型相同的bean, 就不会知道spring到底要注入哪个,会报错。所以在使用spring的时候,一旦选择使用 bytype ,一定要确定当前这个xml文件中只有一个对应的类型的bean。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtKqKy6z-1612785198516)(C:\Users\Administrator\Desktop\1\2-8.3.png)]

4.Constructor

Constructor—构造器自动注入

spring会寻找与它参数类型对应的相同的bean,通过构造方法来进行自动注入,要求类上面必须要有构造方法,或者通过插件lombok来实现构造方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Wo1jtdp-1612785198522)(C:\Users\Administrator\Desktop\1\2-8.4.png)]

5.default

default—指向父标签的装配方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9U9KVW6-1612785198525)(C:\Users\Administrator\Desktop\1\2-8.5.png)]

自动装配优缺点

自动装配方式比原始操作更简单,但它在xml文件中注入的是哪个bean,是看不到的。

优点:

自动装配可以配置与Java代码同步更新,就给一个bean添加一个依赖,就自动实现而不需要修改配置。在开发过程中可以大量使用。但是系统稳定性改为显式装配。

缺点:

1.spring在装配的时候尽量使用猜测的方式,因为装配不明确,出现难以预料的结果。并且spring所管理的对象之间的关联关系也不在清晰进行文档化。

如果编程的时候没有使用到自动装配,那么在程序中最好不使用自动装配,不然容易引起开发人员混淆。

通常都是直接用set的方式来装配。特殊的时候才用,能用set就用set。

在spring注入的时候尽量的使用活的方式。

Spring框架常用标签

spring框架中主要有四种标签bean、alias、import、beans,其中bean标签是其他标签的基础,我们主要对bean标签的属性及其子元素进行讨论。

一、bean标签的属性

1)scope:用来配置spring bean的作用域 ,他在的bean的属性中去进行配置。

2)singleton:表示bean为单例的(默认我们的spring下的bean都是单例)

3)abstract:设置为true,将该bean仅仅作为模板使用,应用程序上下文不会试图预先初始化它

<bean id=“user02” class=“com.zll.collection.User” abstract=“true” >

4)lazy-init:设为true,延迟加载,该bean不会在ApplicationContext启动时提前被实例化,而是第一次向容器通过getBean索取bean时实例化

<bean id=“user02” class=“com.zll.collection.User” lazy-init=“true” >

注:只对singleton的bean起作用

5)autowire:自动装配

6)dependency-check:依赖检查

7)depends-on:表示一个bean的实例化依靠另一个bean先实例化;

8)autowire-candidate:设为false,容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其他bean自动装配的候选者,但是该bean本身可以使用自动装配来注入其他bean

9)primary:该bean优先被注入

10)init-method:初始化bean时调用的方法

11)destory-method:容器销毁之前所调用的方法

12)factory-method:当调用factory-method所指向的方法时,才开始实例化bean

13)factory-bean:调用静态工厂方法的方式创建bean

二、bean的子元素

1)meta:元数据,当需要使用里面的信息时可以通过key获取

2)lookup-method:获取器注入,是把一个方法声明为返回某种类型的bean但实际要返回的bean是在配置文件里面配置的

3)replaced-method:可以在运行时调用新的方法替换现有的方法,还能动态的更新原有方法的逻辑

4)constructor-arg:对bean自动寻找对应的构造函数,并在初始化的时候将设置的参数传入进去

5)property:基本数据类型赋值

6)qualifier:通过Qualifier指定注入bean的名称

Spring的作用域

Spring里边的bean中有一个属性: scope(作用域)

通过scope可以设置当前spring创建出来的bean的模式, 使用的是单例还是多例。

一般在进行spring的配置作用域的时候,都可以通过scope来确定创建的bean是哪个。

在面向对象程序设计中作用域一般指对象或变量之间的可见范围。

而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围

其实就是我们设置一下我们bean的使用范围。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-93ardhqT-1612785198528)(C:\Users\Administrator\Desktop\1\2-8.6.png)]

通过spring创建出来的对象默认是单例模式。

1. singleton

单例模式,默认情况下就是单例模式

当Spring中一个bean的作用域为singleton时, 那么Spring IoC容器中只会存在一个共享的该bean实例,并且所有对该bean的引用,只要id与该bean定义相匹配,则只会返回bean的单一实例。单一实例会被存储在单例缓存中,为Spring的缺省(默认的作用)作用域。这就好比一个教室中的饮水机,在教室中的每个学生都可以使用这个饮水机,对于教室这个容器来说,饮水机就是一个作用域为singleton的bean。

作用域为singleton的bean它的生命周期与Spring IoC容器是一致的,该bean在容器初始化的时候被创建,然后将被一直保留到容器中,当容器销毁后,bean也将被销毁。通常情况下如果不指定bean的作用域,默认将被设置成singleton作用域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qey94iNQ-1612785198530)(C:\Users\Administrator\Desktop\1\2-8.7.png)]

<bean id="user" class="com.zll.spring.User">
	<property name="id" value="111"></property>
	<property name="name" value="zll"></property>
	</bean>
	
	<bean id="user01" class="com.zll.spring.User">
	<property name="id" value="1111"></property>
	<property name="name" value="zllz"></property>
	</bean>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-coqDnSZc-1612785198531)(C:\Users\Administrator\Desktop\1\2-8.8.png)]

使用注解写作用域

@Scope("singleton")
public class User {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

通过这个来扫描包,他就会自动注入

<context:component-scan base-package="com.zll.spring"></context:component-scan>

2.prototype

bean在创建时是多个对象,不是单例,而是多例

<bean id="user" class="com.zll.spring.User" scope="prototype">
	<property name="id" value="111"></property>
	<property name="name" value="zll"></property>
	</bean>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JMex8DWw-1612785198533)(C:\Users\Administrator\Desktop\1\2-8.9.png)]

每次对Bean请求的时候,Spring IoC都会创建一个新的作用域。

我们每次创建对象都是新的对象,不是共享的对象。

对于有状态的Bean应该使用prototype,对于无状态的Bean则使用singleton

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zb72KEjF-1612785198535)(C:\Users\Administrator\Desktop\1\2-8.10.png)]

3.request

Request作用域针对的是每次的Http请求,Spring容器会根据相关的Bean的定义来创建一个全新的Bean实例。而且该Bean只在当前request内是有效的。

4.session

针对http session起作用,Spring容器会根据该Bean的定义来创建一个全新的Bean的实例。而且该Bean只在当前http session内是有效的。

5.global session

<bean id=“userInfo” class=“com.zll.UserInfo” scope=“globalSession">

类似标准的http session作用域,不过仅仅在基于portlet的web应用当中才有意义。Portlet规范定义了全局的Session的概念。他被所有构成某个portlet外部应用中的各种不同的portlet所共享。在global session作用域中所定义的bean被限定于全局的portlet session的生命周期范围之内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值