Spring—bean

一、bean的作用域

单例

默认化为:单例(singleton)

SpringBean类:

package com.hei.bean;
public class SpringBean {
public SpringBean(){
    System.out.println("Springbean的无参数构造方法执行了");
}
}

 spring,xml:

<bean id="sb" class="com.hei.bean.SpringBean"></bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        SpringBean s1= applicationContext.getBean("sb", SpringBean.class);
        System.out.println(s1);
        SpringBean s2= applicationContext.getBean("sb", SpringBean.class);
        System.out.println(s2);
        SpringBean s3= applicationContext.getBean("sb", SpringBean.class);
        System.out.println(s3);
        }
    }

多例

可以手动的调用多例对象(prototype),在xml中利用 scope:

spring.xml:

<bean id="sb" class="com.hei.bean.SpringBean" scope="prototype"></bean>

scope

工厂模式的三种形态

简单工厂模式

 抽象产品类:

package test1;
 public abstract class Weapon {//抽象类
    public abstract void attack();
}

 具体产品类:

package test1;
public class Tank extends Weapon{//具体类
    @Override
    public void attack(){
        System.out.println("坦克准备起步...");
    }
}

package test1;
public class Figter extends Weapon{//具体类
    @Override
    public void attack(){
        System.out.println("战斗机准备起飞...");
    }
}

package test1;
public class Dagg extends Weapon{//具体类
    @Override
    public void attack(){
        System.out.println("某某某正在砍敌人");
    }
}

工厂类:

package test1;
public class WeaponFactory {//工厂类
    //静态方法:要获取什么产品,就看你传的什么参数
    //简单工厂模式中有一个静态方法,被称为静态工厂方法模式
    public static Weapon Get(String type){
        if("Tank".equals(type)){
            return new Tank();
        }else if("Figter".equals(type)){
            return new Figter();
        }else if("Dagg".equals(type)){
            return new Dagg();
        }
        return null;
    }
}

测试类:

public class test1 {
    public static void main(String[] args)  {
       Weapon t= WeaponFactory.Get("Tank");
       t.attack();
        Weapon f= WeaponFactory.Get("Figter");
        f.attack();
        Weapon d= WeaponFactory.Get("Dagg");
        d.attack();

    }
    }

工厂方法模式

 

抽象产品:

package test1;
 public abstract class Weapon {//抽象类
    public abstract void attack();
}

具体产品:

package test1;
public class Tank extends Weapon{//具体类
    @Override
    public void attack(){
        System.out.println("坦克准备起步...");
    }
}

package test1;
public class Dagg extends Weapon{//具体类
    @Override
    public void attack(){
        System.out.println("某某某正在砍敌人");
    }
}

抽象工厂:

package test1;
public abstract class WeaponFactory {//抽象工厂
    public abstract Weapon Get();
}

具体工厂:

package test1;
public class TankFactory extends WeaponFactory{
    @Override
    public Weapon Get() {
        return new Tank();
    }
}

package test1;
public class DaggFactory extends WeaponFactory{
    @Override
    public Weapon Get() {
        return new Dagg();
    }
}

测试类:

public class test1 {
    public static void main(String[] args)  {
        WeaponFactory weaponFactory=new TankFactory();
        Weapon tank=weaponFactory.Get();
        tank.attack();
        WeaponFactory weaponFactory1=new DaggFactory();
        Weapon dagg=weaponFactory1.Get();
        dagg.attack();

    }
    }

Bean的实例化方法

1.通过构造方法实例化

在配置文件(spring.xml)中,进行bean的实例化。

SpringBean类:

package com.hei.bean;
public class SpringBean {
public SpringBean(){
    System.out.println("Springbean的无参数构造方法执行了");
}
}

 spring.xml:

<bean id="sb" class="com.hei.bean.SpringBean"></bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        SpringBean s1= applicationContext.getBean("sb", SpringBean.class);
        System.out.println(s1);
        }
    }

2.通过简单工厂模式实例化

产品类:

package com.hei.bean;
public class Star {
    public Star(){
        System.out.println("Star的无参构造方法");
    }
}

工厂类:

package com.hei.bean;
public class StarFacroty {
    public static Star get(){
        return new Star();
    }
}

spring.xml中:

<!--   在Spring配置文件中告诉Spring框架,调用哪个类哪个方法创建bean-->
    <bean id="star" class="com.hei.bean.StarFacroty" factory-method="get"></bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        Star s= applicationContext.getBean("star", Star.class);
        System.out.println(s);
        }
    }

3.通过factory-bean实例化(工厂方法模式)

具体产品类:

package com.hei.bean;
public class Gun {//具体产品
    public Gun(){
        System.out.println("Gun的无参数构造方法");
    }
}

具体工厂类:

package com.hei.bean;
public class GunFactory {//具体工厂
    public Gun get(){
        return new Gun();
    }
}

spring.xml:

<!--通过工厂方法模型,结合factory-bean+factory-method-->
    <bean id="gunfactory" class="com.hei.bean.GunFactory"></bean>
<!-- factory-bean告诉Spring调用哪个对象,factory-method告诉Spring调用该对象的哪个方法-->
   <bean id="gun" factory-bean="gunfactory" factory-method="get"></bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        Gun g = applicationContext.getBean("gun", Gun.class);
        System.out.println(g);
        }
    }

4.通过FactoryBean接口实例化

对第三种方式的一种简化:

Person类:

package com.hei.bean;
public class Person {
    public Person(){
        System.out.println("Person的无参构造");
    }
}

 PersonFactoryBean类:

package com.hei.bean;
import org.springframework.beans.factory.FactoryBean;
public class PersonFactoryBean implements FactoryBean<Person> {
    @Override
    //最主要的方法
    public Person getObject() throws Exception {
        return new Person();
    }
    @Override
    public Class<?> getObjectType() {
        return null;
    }
    //判断是不是为单例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

spring.xml:

<!--是第三种方式的简化-->
    <bean id="person" class="com.hei.bean.PersonFactoryBean"></bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        Person p = applicationContext.getBean("person", Person.class);
        System.out.println(p);
        }
    }

BeanFactory和FactoryBean区别

 FactoryBean实际应用注入Date

student类:

定义一个Date类型的日期,通过set方法赋值。

package com.hei.bean;
import java.util.Date;
public class Student {
    private Date brith;
    public void setBrith(Date brith) {
        this.brith = brith;
    }
    @Override
    public String toString() {
        return "Student{" +
                "brith=" + brith +
                '}';
    }
}

StudentFactoryBean类:

要设置一个日期,需要在程序中传一个字符串(代表日期)

package com.hei.bean;
import org.springframework.beans.factory.FactoryBean;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StudentFactoryBean implements FactoryBean<Date> {
    private String strdate;
    public StudentFactoryBean(String strdate) {
        this.strdate = strdate;
    }
    @Override
    public Date getObject() throws Exception {
        //创建日期
        SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd");
        Date date=s.parse(strdate);
        return date;
    }
    @Override
    public Class<?> getObjectType() {
        return null;
    }
    @Override
    public boolean isSingleton() {
        return true;
    }
}

 spring.xml:

<bean id="date" class="com.hei.bean.StudentFactoryBean">
    <constructor-arg index="0" value="2003-12-15"></constructor-arg>
</bean>
    <bean id="student" class="com.hei.bean.Student">
        <property name="brith" ref="date"></property>
    </bean>

测试类:

package com.hei;
import com.hei.bean.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        Student s = applicationContext.getBean("student",Student.class);
        System.out.println(s);
        }
    }

Bean的生命周期

Bean的生命周期之五步

第一步:实例化Bean是调用此方法的无参构造。

第二步:Bean属性赋值,调用Set方法进行。

第三步:初始化Bean,在类中自己定义一个初始化方法。

第四步:使用Bean,要在spring.xml配置文件中,手动指定初始化方法名和销毁方法名,还需给属性赋值。

第五步:销毁Bean, 在类中自己定义一个销毁方法。

注:在测试类中,要想销毁Bean需关闭spring容器,applicationContext是一个抽象类,需要转换类型为ClassPathXmlApplicationContext.

User类:

package com.hei.bean;
public class User {
    private String name;
    public User() {
       System.out.println("第一步 无参数构造方法执行");
    }
    public void setName(String name) {
        System.out.println("第二步 给bean属性赋值");
        this.name = name;
    }
    public void InitaBean(){
        System.out.println("第三步 初始化bean");
    }
    public void destoryBean(){
        System.out.println("第五步 销毁bean");
    }
}

spring.xml:

<!--需要手动指定初始化方法和销毁方法-->
    <bean id="Bean" class="com.hei.bean.User" init-method="InitaBean" destroy-method="destoryBean">
        <property name="name" value="zhangsan"></property>
</bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        User user= applicationContext.getBean("Bean",User.class);
        System.out.println("第四步 使用bean "+user);
        //使用完了之后要销毁bean,需关闭Spring容器
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
        context.close();
    }
    }

Bean的生命周期之七步

 

User类:

package com.hei.bean;
public class User {
    private String name;
    public User() {
       System.out.println("第一步 无参数构造方法执行");
    }
    public void setName(String name) {
        System.out.println("第二步 给bean属性赋值");
        this.name = name;
    }
    public void InitaBean(){
        System.out.println("第三步 初始化bean");
    }
    public void destoryBean(){
        System.out.println("第五步 销毁bean");
    }
}

 Bean后处理器:BeanPost类:

package com.hei.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class Beanpost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
       System.out.println("执行Bean后处理器的before方法");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行Bean后处理器的after方法");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

spring.xml:

<!--配置Bean后处理器-->
<!-- Bean后处理器将作用于当前配置文件所有的bean-->
    <bean class="com.hei.bean.Beanpost"></bean>
    <!--需要手动指定初始化方法和销毁方法-->
    <bean id="Bean" class="com.hei.bean.User" init-method="InitaBean" destroy-method="destoryBean">
        <property name="name" value="zhangsan"></property>
</bean>

测试类:

public class Test {
    @org.junit.Test
    public void Test() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        User user= applicationContext.getBean("Bean",User.class);
        System.out.println("第四步 使用bean "+user);
        //使用完了之后要销毁bean,需关闭Spring容器
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
        context.close();
    }
    }

Bean的生命周期之十步

 

User类:

package com.hei.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {
    private String name;
    public User() {
       System.out.println("第一步 无参数构造方法执行");
    }
    public void setName(String name) {
        System.out.println("第二步 给bean属性赋值");
        this.name = name;
    }
    public void InitaBean(){
        System.out.println("第四步 初始化bean");
    }
    public void destoryBean(){
        System.out.println("第七步 销毁bean");
    }
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("Bean这个类的加载器:"+classLoader);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("生产这个Bean的工厂:"+beanFactory);
    }
    @Override
    public void setBeanName(String s) {
        System.out.println("这个Bean的名字:"+s);
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean's destory的方法执行");

    }
    @Override
    public void afterPropertiesSet() throws Exception {
         System.out.println("InitializingBean's afterPropertiesSet的方法执行");
    }
}

只需在User类中添加多个接口,其他类和配置文件不变。

Bean生命周期不同作用域

spring容器只对singleton(单例)的Bean进行完整的生命周期管理。

如果是prototype(多例)作用域的Bean,Spring容器只负责将该Bean初始化完毕,等客户端程序一旦获取到该Bean之后,到使用Bean之后,Spring容器就不再管理该对象的生命周期了。

自己new的对象纳入Spring容器管理

Student类:

package com.hei.bean;
public class Student {
}

 测试类:

public class Test {
    @org.junit.Test
    public void test() {
        Student s = new Student();
        System.out.println(s);
        //将new的对象交给spring容器管理
        DefaultListableBeanFactory d = new DefaultListableBeanFactory();
        d.registerSingleton("student", s);
        //从spring容器中获取
        Object S= d.getBean("student");
        System.out.println(S);
    }
}

Bean的循环依赖

循环依赖:

单例和set模式下的循环依赖

 husband类:

package com.hei.bean;
public class Husband {
    private String name;
    private Wife wife;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setWife(Wife wife) {
        this.wife = wife;
    }
    @Override
    public String toString() {
        return "Husband{" +
                "name='" + name + '\'' +
                ", wife=" + wife.getName() +
                '}';
    }
}

wife类:

package com.hei.bean;
public class Wife {
    private String name;
    private Husband husband;
    public void setName(String name) {
        this.name = name;
    }
    public void setHusband(Husband husband) {
        this.husband = husband;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Wife{" +
                "name='" + name + '\'' +
                ", husband=" + husband.getName() +
                '}';
    }
}

spring.xml:

<bean id="hus" class="com.hei.bean.Husband" scope="singleton">
    <property name="name" value="张三"/>
    <property name="wife" ref="wife"></property>
</bean>
    <bean id="wife" class="com.hei.bean.Wife" scope="singleton">
        <property name="name" value="小花"/>
        <property name="husband" ref="hus"></property>
    </bean>

测试类:

public class Test {
    @org.junit.Test
    public void test(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        Wife w= applicationContext.getBean("wife",Wife.class);
        System.out.println(w);
        Husband h= applicationContext.getBean("hus",Husband.class);
        System.out.println(h);
    }
    }

多例和set模式下的循环依赖

当两个bean的scope都是prototype(多例)会出现异常,若其中一个为singleton(单例)就不会出现异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/703330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全领域国内外有哪些法律法规?

1. 中国 1.中华人民共和国网络安全法&#xff08;简称网安法&#xff09; 生效时间&#xff1a;2017年6月1日主要内容&#xff1a;规范网络运营行为&#xff0c;维护网络安全&#xff0c;保护国家安全和公共利益&#xff0c;以及保护公民、法人和其他组织的合法权益。 2.中华…

CMA、CNAS软件检测报告如何收费?软件测评中心出具报告需多久?

众所周知&#xff0c;各行各业都需要资质认证&#xff0c;正如教师会有教师资格证&#xff0c;医师会有医师资格证&#xff0c;律师会有律师证&#xff0c;软件产品亦如此。对于软件测试报告来说CMA和CNAS资质认证就是获得行业甚至国家认可的重要依据。 CMA和CNAS软件检测报告…

将对象序列化到文件

ObjectOutputStream可以将一个内存中的Java对象通过序列化的方式写入到磁盘的文件中。被序列化的对象必须要实现Serialzable序列化接口&#xff0c;否则会抛出异常。 创建对象 public class Users implements Serializable {private int userid;private String username;priv…

C++和C语言到底有什么区别?

引言&#xff1a;C和C语言是两种非常常见的编程语言&#xff0c;由于其广泛的应用和灵活性&#xff0c;它们在计算机科学领域内受到了广泛的关注。虽然C是从C语言发展而来的&#xff0c;但是这两种语言在许多方面都有所不同。本文将对C和C语言进行比较和分析&#xff0c;以便更…

C++中的结构体——结构体中const的使用场景

作用&#xff1a;用const来防止误操作 示例 运行结果

2024最新流媒体在线音乐系统网站源码 音乐社区 多语言开心版

本文选自&#xff1a;2024最新流媒体在线音乐系统网站源码 音乐社区 多语言开心版 - 源码1688 应用介绍 简介&#xff1a; 2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版 图片&#xff1a;

独立游戏之路:Tap篇 -- 获取OAID提升广告收益

Unity 之 获取手机:OAID、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA)二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建四、总结前言 在当今的移动…

staruml怎么合并多个Project工程文件

如图现在有两个staruml文件 现在我想要把project2合并到project1里面 步骤如下&#xff1a; 1、首先打开project2 2、如图选择导出Fragment 3、选中自己想导出的模块&#xff08;可以不止一个&#xff09; 4、将其保存在桌面 5、打开project1 6、选择导入 7、选中刚刚…

RocketMQ事务性消息

RocketMQ事务性消息是一定能保证消息发送成功的 事务消息发送步骤&#xff1a; &#xff08;1&#xff09;发送方将半事务消息发送至RocketMQ服务端。 &#xff08;2&#xff09;RocketMQ服务端将消息持久化之后&#xff0c;向发送方返回ack确认消息已经发送成功。由于消息为…

H323 截包分析辅流问题

辅流问题&#xff08;h264\h264hp\h265&#xff09; 终端1 &#xff1a; 192.168.1.1 入会发送辅流 终端2 &#xff1a; 192.168.1.2 入会接收辅流 问题 &#xff1a; 终端2不显示辅流 1、筛选 h245 h225 协议 分别筛选以下IP进行查看截包内容 (h225 || h245) && …

10 款最佳免费 Google SEO 工具

谷歌提供了免费测试和报告的工具&#xff0c;以帮助网站所有者和 SEO 专业人员分析和提高其网站的搜索性能。这些是最好的免费谷歌搜索引擎优化工具&#xff0c;用于升级您的搜索引擎优化&#xff0c;以及帮助您发现新的关键字机会以及帮助您发现新的关键字机会的工具。 无论您…

C++并发之定时互斥(std::timed_mutex)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 lock3.3 try_lock3.4 try_lock_for3.5 try_lock_until3.6 unlock1 概述 定时互斥是一种时间可锁定的对象,它设计用于在代码的关键部分需要独占访问时发出信号,就像常规互斥一样,但还支持定时尝试锁定请求。   因此,time…

【算法专题--链表】合并两个有序链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐迭代法 --- 带哨兵位&#xff08;头节点&#xff09; ⭐递归法 四、总结与提炼 五、共勉 一、前言 合并两个有序链表这道题&#xff0c;可以说是--链表专题--&#xff0c;比较经典的一道题&#xff0c;也是在面试中频率较高的一道…

javaSSM整合的一个小项目(员工管理系统)

前言&#xff1a; 本人是一个大三的计算机专业学生。这学期学习了Java的企业级应用开发这门课&#xff0c;最后&#xff0c;有一个结课的小项目&#xff0c;是使用SSM整合写一个系统。我本次写的是一个员工管理系统&#xff0c;虽然十分的简单&#xff0c;但是足以应对这次的期…

[学习笔记] VFX Silhouette

目录 Part 1 : The interface of Silhouettte &#xff08;Silhouette的界面介绍&#xff09; Part 2: The shape divisions and manual roto&#xff08;形状分区和手动roto工作&#xff09;: Part 3: tracking &#xff1a; Part 4: Mocha Tracking Part 5: Motion Blur(…

ColorEasyDuino上手指南

介绍 ColorEasyDuino是嘉立创推出的一块Aduino开发板&#xff08;类似物&#xff09;&#xff0c;具有丰富的外设接口&#xff1a;uart、i2c、spi、adc、pwm等&#xff1b;开发板设计参考原型是Arduino Uno&#xff0c;采用的芯片是ATMEGA328P&#xff0c;它的外观设计比较紧凑…

【git使用三】git工作机制与命令用法

目录 git工作机制和相关概念 四个重要区域 分支的概念 上传代码到远程分支的基本流程 克隆代码 仓库同步 开发者如何提交代码到远程仓库分支 1.初始化本地仓库 2.关联本地仓库和远程仓库 创建关联 查看关联情况 如何解除关联 3.推送代码到远程仓库 3.1先下拉远程…

Python算法于强化学习库之rlax使用详解

概要 在强化学习领域,开发和测试各种算法需要使用高效的工具和库。rlax 是 Google 开发的一个专注于强化学习的库,旨在提供一组用于构建和测试强化学习算法的基础构件。rlax 基于 JAX,利用 JAX 的自动微分和加速计算功能,使得强化学习算法的实现更加高效和简洁。本文将详细…

[数据分享第二弹]降水、植被、土壤等生态相关数据分享

数据是GIS的重要组成部分&#xff0c;也是我们进行研究分析的基础。在日常工作中&#xff0c;我们时常因数据问题而犯难&#xff0c;今天就来继续做一波相关数据分享。 1.世界土壤数据库&#xff08;HWSD&#xff09;全球土壤数据 世界协调土壤数据库 2.0 版 &#xff08;HWS…

【电子通识】为何焊接时要使用助焊剂?常用的助焊剂类型有哪些?

在工作中&#xff0c;我们会接触到板卡的焊接&#xff0c;会使用到助焊剂&#xff0c;如常常使用的就有松香。如下所示为焊接芯片时使用的拖焊&#xff0c;如果没有助焊剂&#xff0c;很有可能导致管脚连锡或有毛刺等现象出现。 那么助焊剂是什么&#xff1f;为什么它对焊接项目…