spring中bean


一、什么是bean

什么是bean?

spring相当于工厂,bean相当于工厂中的产品。而工厂(spring)负责产品(bean)的生产和管理。

tips:

Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean 。


二、bean的配置

bean的配置方式有两种:

  1. xml方式进行配置
  2. property方式进行配置

在这里插入图片描述


三、bean的作用域

在这里插入图片描述

四、bean的生命周期

spring可以管理spring中部分作用域的生命周期。对于sington,prototype。情况如下:
在这里插入图片描述

具体的生命周期流程图如下:
在这里插入图片描述

五、bean的装配方式

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配)

5.1 基于xml的装配

在这里插入图片描述

例子:

package com.fengli;

import com.fengli.beans.Bean1;
import com.fengli.beans.Bean2;
import com.fengli.beans.Bean3;
import com.fengli.beans.Bean4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    private static ApplicationContext context;



    public static void main(String argc[]){
        /**
         * 构造器实例化,使用默认构造函数。
         */

        context=new ClassPathXmlApplicationContext("SpringBeans.xml");
        Bean1 bean1= (Bean1) context.getBean("bean1");
        bean1.eatBean();

        /**
         * 使用静态工厂方式进行bean实例化
         */
        Bean2 bean2= (Bean2) context.getBean("bean2");
        bean2.bean2DoSomething();

        /**
         * 使用工厂方式进行bean
         */
        Bean3 bean3= (Bean3) context.getBean("bean3");
        bean3.bean3Want();

        //基于xml的两种装配方式

        Bean4 bean4= (Bean4) context.getBean("bean4");

        Bean4 anoterBean4= (Bean4) context.getBean("anotherBean4");

        bean4.bean4DoSomething();
        anoterBean4.bean4DoSomething();


    }
}

对应的SpringBeans.xml

 <bean id="bean4" class="com.fengli.beans.Bean4">
                <constructor-arg index="0" value="litte bean"></constructor-arg>
                <constructor-arg index="1" value="2"></constructor-arg>
        </bean>

        <bean id="anotherBean4" class="com.fengli.beans.Bean4">
                <property name="name" value="litte bean"></property>
                <property name="count" value="40"></property>
        </bean>

5.2 基于annotation的装配

基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。Spring提供了对注解的支持
在这里插入图片描述

例子:
目录结构:
在这里插入图片描述

UserDaoImp.java

@Repository("userDao")
public class UserDaoImp implements UserDao {
    public void doSomething() {
        System.out.println("userDaoImp doSomething");
    }
}

Service1.java

@Service("service1")
public class Service1 {

    @Resource(name = "userDao")
    private UserDao userDao;

    public void firstService(){
        userDao.doSomething();
    }

   /* public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }*/
}

Controller1.java

@Controller("controller1")
public class Controller1 {
    @Resource(name = "service1")
    private Service1 service1;

    public void A(){
        service1.firstService();
    }

   /* public void setService1(Service1 service1) {
        this.service1 = service1;
    }*/
}

对应的配置:

<!-- 使用这个标签的作用是省略使用Resource等注解时,用传统方式需要在spring配置文件中添加相应的bean -->
 <context:annotation-config></context:annotation-config>
        <bean id="userDao" class="com.fengli.daoImp.UserDaoImp"></bean>
        <bean id="service1" class="com.fengli.services.Service1" ></bean>
        <bean id="controller1" class="com.fengli.controllers.Controller1" ></bean>

tips:对于 <context:annotation-config></context:annotation-config>,参考链接:https://my.oschina.net/wangdaoliang/blog/789478

main方法

 //用于测试基于xml、注解、自动装配方式装配bean
        Controller1 controller1= (Controller1) context.getBean("controller1");
        controller1.A();

运行结果:
在这里插入图片描述

5.3 自动装配方式装配bean

使用这个方法需要记住的要点:

  1. 对相应的class写setter方法
  2. 在bean的的配置中需要指定autowire的依据

对于5.2中的代码,我们放开Controller1,UserDaoImpl 的setter方法。
在SpringBeans.xml:

 <context:annotation-config></context:annotation-config>
        <bean id="userDao" class="com.fengli.daoImp.UserDaoImp"></bean>
        <bean id="service1" class="com.fengli.services.Service1" autowire="byName"></bean>
        <bean id="controller1" class="com.fengli.controllers.Controller1" autowire="byName"></bean>

六、bean的实例化方式

实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。
目录结构:
在这里插入图片描述

SpringBeans.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       <!-- 使用构造函数方式实例化bean -->
        <bean id="bean1" class="com.fengli.beans.Bean1"></bean>

		<!--使用静态工厂方式实例化bean -->
        <bean id="bean2" class="com.fengli.beanFactorys.Bean2Factory" factory-method="getInstance"></bean>
		
		<!--使用工厂方式实例化bean -->
        <bean id="bean3Factory" class="com.fengli.beanFactorys.Bean3Factory"></bean>
        <bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean>
</beans>

demo地址:https://github.com/fenglifenglifengli/bean.git

七、参考文档

Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值