Spring容器和Bean

什么是 Spring容器和Bean


Spring

  Spring的核心容器就是一个大工厂,所有对象都会被Spring核心容器管理,Spring框架的本质就是,通过XML配置来驱动Java代码,这样就可以把原本由Java代码管理的耦合关系,提取到XMl配置文件中管理,这就实现了,系统中的各组件的解耦有利于后期升级和维护。Spring容器中的一切对象都称为Bean,Spring 对Bean没有任何要求,只要它是Java类即可。

对于Spring框架而言,一切Java对象(只要它是Java类即可)都是Bean。

public class User {
    private String name;

    //User的无参构造器
    public User() {
        System.out.println("User的无参构造器被调用");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {

        System.out.println("调用了User的setName方法");
        this.name = name;
    }
}

  对于<bean ...>元素,默认以反射方式来调用该类的无参构造器,其class 反射的必须为实现类并不是接口,对于<property... 它驱动Spring在底层以反射执行一次setter方法,其中的<property... 的name 属性值决定执行那一个setter方法,每个<property...元素默认Spring调用一次setter方法。

      <!-- 向spring 添加 bean -->
    <bean id="user" class="com.test.spring.model.User">
        <!-- 控制setName()方法,将"老王"给user.name赋值  -->
        <property name="name" value="老王"></property>
    </bean>
    <!-- 配置名为:win的bean,其实现类为:javax.swing.JFrame-->
    <bean id="win" class="javax.swing.JFrame"></bean>
    <!-- 配置名为:date的bean,其实现类为:java.util.Date -->
    <bean id="date" class="java.util.Date"></bean>

Spring 常用获取Bean的方法:

  1. T getBean(String name,Class<T> requireType) 返回requireType
  2. Objcet getBean(String name) 返回Object类型。(String name)可以是id和别名。
  @Test
   public void springTest(){
       //加载spring配置文件,获取Sprting容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        //根据bean的 id 和 User.class获取bean(指定了 Bean的类型)
        User user = applicationContext.getBean("user",User.class);
        System.out.println("获取spring.xml对User的赋值:"+user.getName());

        //设置时间格式
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd") ;
        Date date = new Date();
        System.out.println("通过new:"+sf.format(date.getTime()));
        // 根据bena的id获取bean,获取得到的是Objcet类型需要强转
        Date date2 = (Date) applicationContext.getBean("date");
        System.out.println("获取Spring容器里面的Date:"+sf.format(date2.getTime()));
    }

image_1c5h0tfhgg2ij7ecvm1b6t2df9.png-35.8kB

ApplictionContext 与 BeanFactory

  Spring容器最基本的接口是BeanFactory 负责配置、创建、管理Bean,它有一个子接口: AnpplicationContext(Spring的上下文),它争强了Beanfactory的功能。Spring容器还负责管理Bean与Bean之间的依赖关系。

  当系统创建ApplicationContext ,默认会初始化所有的singletion Bean包括构造器创建Bean实例,并根据<property...元素执行setter方法。当系统创建ApplicationContext,前期有比较大的系统开销,但ApplicationContext被创建完成后,程序后面获取singletion Bean实例将会拥有比较好的性能。ApplicationContext 包括BeanFactory的全部功能。

    @Test
    public  void  BeanFactoryTest(){

     /*   BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
         beanFactory.getBean("date");
*/

        //加载spring配置文件,多个Spring配置
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
        applicationContext.getBean("date");

    }

image_1c5ihhiaihj3oau17e01adm8g89.png-49.4kB

  BeanFactory对于某些内存非常关键的情景使用.

Bean使用

  Spring可以看做一个超级大工厂,Spring 容器中的Bean就是该工厂的产品。
  Spring框架主要做两件事:1.开发bean。2.配置bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成”依赖注入”——这就是所谓IOC的本质。

Bean的基本使用:

id:确实bean的唯一标识,容器对Bean的管理、访问、以及该Bean的依赖关系,都通过该属性完成。Bean的id在Spring容器中都是唯一的。
class: 指定Bean的具体实现类不是接口。Spring必须知道创建Beand的实现类,而不是接口。在默认的设置中Spring会直接使用new 关键字创建该Bean的实例,所有必须提供Bean实现类的类名。
name:指定一个bean实例的标识名,表面将该Bean实例指定为别名
alias:指定一个别名。

  <!--  给 person 设置多个别名 -->
    <bean id="person" class="com.test.spring.model.Person" name="#aa,@123,abc">
    </bean>

    <!-- person设置一个别名 -->
    <alias name="person" alias="per"/>

Bean的作用域

image_1c5iq2v0kg0m1duhuet1vc7gflm.png-25kB

Single:单例模式,在Spting IoC容器中,Single作用域的Bean将只生产一个实例。
Prototype:多例模式,每次通过容器getBaen()获取的Bean都讲产生一个新的Bean实例。
request:对于一次Htttp请求,request 作用域 Bean将只生产一个实例,在同一次reqestHtttp请求会话中,程序每次得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才会真正的生效。
session: 对于一次会话,session作用域的Bean将只生成一个实例。
global:每个全局的HTTP Session 对于一个Bean实例。

当使用:single时:
image_1c5is73u413f113a11pb33uk11k13.png-21.6kB

   @Test
    public  void  BeanFactoryTest(){

     /*   BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
         beanFactory.getBean("date");
*/

        //加载spring配置文件,多个Spring配置
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");

        Person person1 = applicationContext.getBean("person",Person.class);

        Person person2 = applicationContext.getBean("person",Person.class);

            boolean b = person1  == person2;
        System.out.println("对比person1与person2:"+b);
    }

image_1c5is8d42fbm1fhen5c3hq4jb20.png-31.3kB

当时用Prototype时

image_1c5isa08i4mr6gfkd2pm61afm2d.png-31.6kB

 Person person1 = applicationContext.getBean("person",Person.class);

        Person person2 = applicationContext.getBean("person",Person.class);

            boolean b = person1  == person2;
        System.out.println("对比person1与person2:"+b);

image_1c5isb3g71dpf1ppu1ibmmlv1dfc2q.png-47.6kB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值