Spring框架—day05
spring的5种自动装配方式
在spring中有一个配置文件中的元素有一个属性 autowire=“default” ,他是负责进行自动装配(bean中的属性的),可以省去很多的配置,代码就比较简单化,并且美观,但是也有副作用,一旦使用自动装配,就不会读取xml文件中的关于bean的属性。
1.No
No—默认的就是不自动装配,通过ref进行手工方式进行引入
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());
}
3.ByType
ByType—通过属性的property自动装配
再student类中有一个属性为teacher,我们设置为根据类型找,它就会再xml文件中找对应的teacher类型的类,然后通过set方法注入。
@Autowired—这个注解本质就是通过类型找
如果在你的配置文件上有类型相同的bean, 就不会知道spring到底要注入哪个,会报错。所以在使用spring的时候,一旦选择使用 bytype ,一定要确定当前这个xml文件中只有一个对应的类型的bean。
4.Constructor
Constructor—构造器自动注入
spring会寻找与它参数类型对应的相同的bean,通过构造方法来进行自动注入,要求类上面必须要有构造方法,或者通过插件lombok来实现构造方法。
5.default
default—指向父标签的装配方式
自动装配优缺点
自动装配方式比原始操作更简单,但它在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的使用范围。
通过spring创建出来的对象默认是单例模式。
1. singleton
单例模式,默认情况下就是单例模式
当Spring中一个bean的作用域为singleton时, 那么Spring IoC容器中只会存在一个共享的该bean实例,并且所有对该bean的引用,只要id与该bean定义相匹配,则只会返回bean的单一实例。单一实例会被存储在单例缓存中,为Spring的缺省(默认的作用)作用域。这就好比一个教室中的饮水机,在教室中的每个学生都可以使用这个饮水机,对于教室这个容器来说,饮水机就是一个作用域为singleton的bean。
作用域为singleton的bean它的生命周期与Spring IoC容器是一致的,该bean在容器初始化的时候被创建,然后将被一直保留到容器中,当容器销毁后,bean也将被销毁。通常情况下如果不指定bean的作用域,默认将被设置成singleton作用域。
<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>
使用注解写作用域
@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>
每次对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的生命周期范围之内。