文章目录
1.Spring配置
1.1别名
- name:bean的id
- alias:要起的别名
<alias name="hello" alias="hellonew"/>
在测试类中就可以直接通过getBean(“hellonew”)来取出hello这个bean创建的对象。
1.2Bean配置
<!--
id:bean的唯一表识符,也就是相当于对象名
class:bean对象所对应的全限名:包名+类型
name:也是别名,而且可以取多个别名,多个别名可以用逗号分割,可以用空格分割
-->
<bean id="hello01" class="pojo.Hello" name="hellonew hellonew02,hellonew03"/>
1.3import
一般用于团队开发使用,可以将多个配置文件合并为一个
<import resource="beans.xml"/>
通过import语句合并为一个总的,使用的时候使用总的配置文件即可
2.依赖注入
环境搭建
1.复杂类型
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
}
2.1构造器注入
<bean id="student" class="pojo.Student">
<!--第一种:普通数据类型注入,value-->
<property name="name" value="小胖"/>
</bean>
2.2通过Set方式注入
- 依赖注入:Set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中所有属性,由容器来注入
完善注入信息:
<bean id="address" class="pojo.Address"/>
<bean id="student" class="pojo.Student">
<!-- 第二种:Bean注入,ref-->
<property name="address" ref="address"/>
<!-- 第三种:数组注入,ref-->
<property name="books" >
<array>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
<value>红楼梦</value>
</array>
</property>
<!-- list注入-->
<property name="hobbys">
<list>
<value>唱歌</value>
<value>打游戏</value>
</list>
</property>
<!-- Map注入-->
<property name="card">
<map>
<entry key="学号" value="01"/>
</map>
</property>
<!-- set注入-->
<property name="games">
<set>
<value>和平精英</value>
</set>
</property>
<!-- 空值注入-->
<property name="wife">
<null/>
</property>
<!-- properties-->
<property name="info">
<props>
<prop key="成绩">98</prop>
<!-- 相当于是个key-value结构-->
<prop key="成绩">98</prop>
</props>
</property>
</bean>
2.3拓展方式
可以使用p命名空间和c命名空间进行注入。
p命名空间和c命名空间不能直接使用,需要导入xml约束,在beans开头那导入
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
测试类;
public class User {
private String name;
private int id;
//还有getter、setter方法、有参构造、无参构造
}
配置文件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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- p命名空间注入,可以直接注入属性值:property
p命名属于set方式注入,所以需要无参构造和set方法-->
<bean id="user" class="pojo.User" p:name="小胖" p:id="10"/>
<!-- c命名空间注入,通过有参构造器注入:construct-args-->
<bean id="user2" class="pojo.User" c:name="小胖" c:id="18"/>
</beans>
2.4Beans的作用域
范围 | 描述 |
---|---|
singleton | (默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。 |
prototype | 将单个 bean 定义限定为任意数量的对象实例。 |
request | 将单个 bean 定义限定为单个 HTTP 请求的生命周期。 也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。 仅在 Web 感知 Spring 的上下文中有效。ApplicationContext |
session | 将单个 bean 定义限定为 HTTP 的生命周期。 仅在 Web 感知 Spring 的上下文中有效。Session``ApplicationContext |
application | 将单个 bean 定义限定为. 仅在 Web 感知 Spring 的上下文中有效。ServletContext``ApplicationContext |
websocket | 将单个 bean 定义限定为. 仅在 Web 感知 Spring 的上下文中有效。WebSocket``ApplicationContext |
1.单例模式(Spring默认机制)
<bean id="user2" class="pojo.User" c:name="小胖" c:id="18" scope="singleton"/>
//获取的两个对象地址一致,是同一个对象
User user1 = (User) context.getBean("user2");
User user2 = (User) context.getBean("user2");
System.out.println(user1 == user2);//输出为true
2.原型模式:每次从容器中get的时候都会产生一个新对象
<bean id="user2" class="pojo.User" c:name="小胖" c:id="18" scope="prototype"/>
//每次获取都是一个新对象,所以输出为false
User user1 = (User) context.getBean("user2");
User user2 = (User) context.getBean("user2");
System.out.println(user1 == user2);
3.其余的request、session、application,这些只能在web开发中才可以使用
3.Bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文自动寻找,并自动给bean装属性
在Spring中有三种自动装配的方式
1.在xml中显示配置
2.在java中显示配置
3.隐式的自动装配bean
3.1测试环境搭建
@Data
public class People {
private Cat cat;
private Dog dog;
private String name;
}
public class Dog {
public Dog(){
System.out.println("wang~");
}
}
public class Cat {
public Cat(){
System.out.println("miao~");
}
}
3.2自动装配(autowire)
1.按照名字来自动装配byName
<bean id="cat" class="pojo.Cat"/>
<bean id="dog" class="pojo.Dog"/>
<!-- 会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
如:设置完之后会自动去找beanid为cat或者dog的进行自动装配-->
<bean id="people" class="pojo.People" autowire="byName">
<property name="name" value="小胖"/>
</bean>
2.按照类型来自动装配byType
<bean id="cat11" class="pojo.Cat"/>
<bean id="dog22" class="pojo.Dog"/>
<!-- 会自动在容器上下文中查找,和自己对象属性类型相同的bean,而这样的话beanid就可以随意设置了
但是两个对象属性一致的时候就会报错,这也是按类装配的弊端-->
<bean id="people" class="pojo.People" autowire="byType">
<property name="name" value="小胖"/>
</bean>
小结:
- byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法一致。.
- byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致。
3.3使用注解实现自动装配
3.3.1使用注解须知
1.导入约束:
xmlns:context="http://www.springframework.org/schema/context"
2.配置注解的支持:
<context:annotation-config/>
3.3.2@Autowired
在属性上使用即可,也可以在set方式上使用:
@Data
public class People {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String name;
}
-
使用Autowired注解之后set方法也可以不用写了,前提是这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byName
-
如果显示的定义Autowired的required属性为false,说明这个对象可以为null(在beans文件下可以不用配置该属性值也不会报空指针异常),否则不允许为空
@Autowired(required = false) private Cat cat;
-
或者与required = false等价的就是再加上一个注解@Nullable,表示该字段可以为null。
-
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】来完成的时候,我们可以通过@Qualifier(value = “xxx”)去配置@Autowired的使用
<!--当beans有两个以上的同类型对象,则可以通过添加注解@Qualifier(value = "cat2"),来指定要取出的对象是xxx-->
<bean id="cat" class="pojo.Cat"/>
<bean id="cat2" class="pojo.Cat"/>
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
3.3.3@Resource
@Resource基本包括了@Autowired的所有功能
//name = "cat1"相当于是@Qualifier(value = "xxx")
@Resource(name = "cat1")
private Cat cat;
@Resource
private Dog dog;
小结:@Resource和@Autowired区别
-
都是自动装配的,都可以放在属性字段上
-
@Autowired是通过byType的方式实现的,名字不规范则需要用到@Qualifier
-
@Resource默认通过byName方式实现,如果找不到名字则会通过byType去实现
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84166.html