Spring学习--Spring Bean管理
Posted 肖帆咪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习--Spring Bean管理相关的知识,希望对你有一定的参考价值。
Spring Bean管理
基于 xml 配置方式
bean 配置需要 spring 管理的类
id 生成的对象名
class 全类名
name 对象别名,可以为多个
scope:
singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式. prototype:原型 getBean()的时候都会 new Bean()
request:每次 http 请求都会创建一个 bean, 仅用于 WebApplicationContext
环境
session:同一个 http session 共享一个 Bean, 不同 Session 使用不同的 Bean, 使用环境同上
Xml 配置方式依赖注入【DI:Dependency Injection】
将对象依赖属性通过配置设置给对象,实现IOC需要DI支持
注入的方法:
1.set注入
我们创建一个user类,写入属性(生成get set方法)
package com.spring0.bean;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class User {
private int id;
private String name;
private Phone phone;//自定义类的属性
private List list;
private Map map;
private Set set;
private Properties properties;//此类就是用来封装properties的标签
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
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;
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
public User() {
System.out.println("User 构造方法");
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\\'' +
", phone=" + phone +
", list=" + list +
", map=" + map +
", set=" + set +
", properties=" + properties +
'}';
}
}
创建一个xml文件,为user对象使用set的方法注入值
<?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">
<!-- 依赖注入 DI
在spring框架创建对象时,可以向对象中的属性赋值(注入值)
方式1:通过属性的set方法注入
-->
<bean id="phone" class="com.spring0.bean.Phone" ></bean>
<bean id="user" name="user1,user2" class="com.spring0.bean.User" scope="prototype">
<property name="id" value="1" ></property>
<property name="name" value="admin"></property>
<property name="phone" ref="phone"></property>
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="val1"></entry>
<entry key="key2" value="val2"></entry>
<entry key="key3" value="val3"></entry>
</map>
</property>
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
</set>
</property>
<property name="properties">
<props>
<prop key="key1">key1</prop>
<prop key="key2">key2</prop>
<prop key="key3">key3</prop>
</props>
</property>
</bean>
</beans>
测试
package com.spring0.test;
import com.spring0.bean.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test2 {
/*
IOC 控制反转
把(创建对象)的控制权
翻转给(spring框架,spring容器)
*/
public static void main(String[] args) {
//创建spring容器 ClassPathXmlApplicationContext 是其中的一个实现类 ApplicationContext上层接口
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
}
运行结果
User 构造方法
User{id=1, name='admin', phone=com.spring0.bean.Phone@4f970963, list=[list1, list2, list3], map={key1=val1, key2=val2, key3=val3}, set=[set1, set2], properties={key3=key3, key2=key2, key1=key1}}
2.构造方法注入
//在user类中创建一个有参的构造方法
package com.spring0.bean;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class User {
private int id;
private String name;
private Phone phone;
public User(int id, String name, Phone phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
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;
}
public User() {
System.out.println("User 构造方法");
}
}
<?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">
<!--
构造方法的注入
-->
<bean id="phone" class="com.spring0.bean.Phone"></bean>
<bean id="user" name="user1,user2" class="com.spring0.bean.User" scope="prototype">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="admin"></constructor-arg>
<constructor-arg name="phone" ref="phone"></constructor-arg>
</bean>
</beans>
测试结果
User{id=1, name='admin', phone=com.spring0.bean.Phone@67b92f0a}
注解方式实现
注解功能封装在 AOP 包中,导入 Spring aop jar 包即可
开启注解扫描
1.在spring.xml中加入约束地址
每次创建一个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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>
2.开启注解扫描
<context:component-scan base-package="包名"> < /context:component-scan>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qA2Z2c6Y-1623561101045)(C:\\Users\\17509\\AppData\\Roaming\\Typora\\typora-user-images\\1622533301757.png)]
注解创建对象
@Component(value=“user”)等于< bean id=“user” class="">< /bean>
package com.spring0.bean;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@Component(value = "user ")
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = 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;
}
}
@Service
package com.spring0.service;
import org.springframework.stereotype.Service;
@Service(value = "userSerivice")
public class Usersrvice {
}
@Repository
package com.spring0.dao;
import org.springframework.stereotype.Repository;
@Repository(value = "userDao")
public class UserDao {
public void save(){
System.out.println("保存用户");
}
}
注解方式注入属性【DI:Dependency Injection】
@Autowired
package com.spring0.service;
import com.spring0.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service(value = "userSerivice")
public class Usersrvice {
//spring框架自带的注解标签
/*
有两种方式找到需要注入的值
1.byType 根据属性类型,在spring容器查找
@Autowired(required = true) 默认注入的属性值不能为空
2.byName @Qualifier(value = "userDao")通过@Repository(value = "userDao")名字查找*/
@Autowired
@Qualifier(value = "userDao")
UserDao userDao;
public void save() {
userDao.save();
}
}
JDK 注解@Resource 自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。
@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入byName 注入引用类型属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。
package com.spring0.service;
import com.spring0.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service(value = "userSerivice")
public class Usersrvice {
/*
@Resource JDK自带的注解标签,使用byName注入
*/
@Resource(name = "userDao")
UserDao userDao;
public void save() {
userDao.save();
}
}
以上是关于Spring学习--Spring Bean管理的主要内容,如果未能解决你的问题,请参考以下文章
学习笔记——Spring管理第三方bean;Spring中Bean的作用域;Spring中Bean的生命周期;Spring中bean的后置处理器;Spring中自动装配
Spring5学习笔记 — “IOC操作Bean管理(基于注解)”