栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Bean管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Bean管理

Spring工厂类
Spring的Bean管理(XML方式)
Spring的属性注入(XML方式)
Spring的Bean管理(注解方式)
Spring的属性注入(注解方式)

Spring工厂

之前用的BeanFactory来完成Spring工厂类的获取,现在已经弃用,改为ApplicationContext类通过new FileSystemXmlApplicationContext()/new ClassPathXmlApplicationContext获取,却别在于FileSystemXmlApplicationContext是通过系统文件加载配置参数,ClassPathXmlApplicationContext是通过工程里面的配置文件来获取配置参数

Spring的Bean管理(XML方式) 三种实例化方式

1.使用类构造器实例化(默认无参数)
2.使用静态工厂方式实例化(简单工厂模式)
3.使用实例工厂的方式实例化(工厂方法模式)
tips:通常使用无参构造器的方法,当类的实例构造特别复杂的时候,使用下面两种工厂的方式

配置文件:









使用类构造器实例化(默认无参数)
package com.imooc.ioc.demo2;


public class Bean1 {
    public Bean1(){
        System.out.println("Bean1被实例化了");
    }
}

使用静态工厂方式实例化(简单工厂模式)
package com.imooc.ioc.demo2;


public class Bean2 {

}
package com.imooc.ioc.demo2;


public class Bean2Factory {
    public static Bean2 createBean2(){
        System.out.println("Bean2Factory已经执行");
        return new Bean2();
    }
}
使用实例工厂的方式实例化(工厂方法模式)
package com.imooc.ioc.demo2;


public class Bean3 {
}
package com.imooc.ioc.demo2;


public class Bean3Factory {
    public Bean3 createBean3(){
        System.out.println("Bean3Factroy方法已经被执行");
        return new Bean3();
    }
}
Bean配置

id和name

​ 一般情况下,装配一个Bean的时候,通过指定一个id属性作为Bean的名称

​ id属性在IOC容器中必须是唯一的

​ 如果Bean的名称中有特殊字符,则需要使用name属性

class

​ 用来设置一个类的完全路径名称,主要作用是IOC容器生成类的实例

Bean的作用域

scope属性

类别说明
singleton在SpringIOC容器中仅存在一个Bean实例,Bean以单例的方式存在,默认值
prototype每次调用getBean1()时都会返回一个新的实例
request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境
Spring容器中Bean的生命周期配置

Spring初始化Bean或销毁bean时,有时需要做一些处理工作,因此spring创建或销毁bean的时候调用bean的两个生命周期方法


当bean被载入到容器的时候调用setup

当bean从容器中删除的时候调用teardown(scope=singleton有效,因为多例模式中,spring不知道将哪个实例销毁)

Spring容器中Bean的生命周期

1.instantiate bean对象实例化

2.populate properties 封装属性

3.如果Bean实现BeanNameAware 执行setBeanName

4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

5.如果存在类实现 BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization

6.如果实现了InitializingBean 执行 afterPorpertiesSet

7.调用指定的初始化方法 init

8.如果存在类实现 BeanPostProcessor(处理Bean),执行postProcessAfterInitialization

9.执行业务处理

10.如果Bean实现 DisposableBean 执行 destory

11.调用 指定销毁方法customerDestory

package com.imooc.ioc.demo3;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MayBeanPostProcessor implements BeanPostProcessor {
    public Object postProcessorBeforeInitialization(Object bean , String beanName) throws BeansException{
        System.out.println("第五步:初始化前方法");
        return bean;
    }

    public Object postProcessorAfterInitialization(final Object bean , String beanName) throws BeansException{
        System.out.println("第八步:初始化后方法");
        if("userDao".equals(beanName)){
            Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if("save".equals(method.getName())){
                        System.out.println("--------------权限校验-------------");
                        method.invoke(bean , args);
                    } else {
                        method.invoke(bean , args);
                    }
                    return null;
                }
            });
            return proxy;
        }
        return bean;
    }
}
Spring的属性注入 对于类成员变量,注入方式有三种

构造函数注入

属性setter方法注入

接口注入

Spring支持前两种方式 Spring的属性注入-构造方法属性注入

通过构造方法注入Bean的属性值或依赖对象,它保证了Bean实例在实例化后就可以使用

构造器注入在元素里声明的属性

package com.imooc.ioc.demo4;

public class User {
    private String name;
    private Integer age;

    public User(String name , Integer age){
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

    
    

Spring的属性注入-set方法注入(常用)

使用set方法注入,在Spring配置文件中,通过设置注入的属性

    
        
        
        
    
    
        
    
Spring的属性注入-p名称空间

使用p命名空间

为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间

p:<属性名>="xxx"引入常量值

p:<属性名>-ref="xxx"引用其他Bean对象


	
	
Spring的属性注入-SpEL注入
  • SpEl:Spring expression language , Spring表达式语言,对依赖注入进行简化
  • 语法:#{表达式}

SpEl表达式语言

语法:#{}

  • #{‘hello’} : 使用字符串
  • #{beanId} : 使用另一个bean
  • #{beanId.content.toUpperCase()} : 使用指定名属性,并使用方法
  • #{T(java.lang.Math).PI} 使用静态字段或方法
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/295068.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号