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管理(基于xml文件)

Spring5学习笔记 — “IOC操作Bean管理(基于注解)”

Spring5学习笔记 — “IOC操作Bean管理(基于注解)”

Spring学习之路bean注解管理AOP操作

spring学习--spring七大模块