SpringBoot装载bean的几种方式

Easter79
• 阅读 586

一、直接装配

package com.lh.bean;

/** 
* @ClassName: MyBean 
* @Description: 简单直接方式注入bean
* @author Liu 
* @date 2018年5月26日 下午6:21:44 
*/
public class MyBean {

}


    /***
    * @Title: createMyBean 
    * @Description: 1、返回bean名称默认为方法名
    *                 2、同时也可以手动指定bean名称
    * @param @return  
    * @return MyBean
    * @throws
     */
    @Bean(name = "myBean")
    @Scope("prototype")//指定为原型方式,即多例
    public MyBean createMyBean() {
        return new MyBean();
    }

二、FactoryBean工厂方式

package com.lh.bean2;

import org.springframework.beans.factory.FactoryBean;

/** 
* @ClassName: RunnableFactoryBean 
* @Description: TODO
* @author Liu 
* @date 2018年5月26日 下午6:44:07 
*/
public class JeepFactoryBean implements FactoryBean<Jeep> {

    @Override
    public Jeep getObject() throws Exception {
        return new Jeep();
    }

    @Override
    public Class<?> getObjectType() {
        return Jeep.class;
    }

    @Override
    public boolean isSingleton() {
//        return true;
        return false;
    }

}


    @Bean
    public JeepFactoryBean createJeepFactoryBean() {
        return new JeepFactoryBean();
    }

注:获取FactoryBean本身的方式需要在bean名称前加"&"或直接以类型获取:

        //获取FactoryBean本身
        System.out.println(ctx.getBean(JeepFactoryBean.class));//class方式
        System.out.println(ctx.getBean("&createJeepFactoryBean"));//name方式

三、普通工厂模式方式

package com.lh.bean3;

/** 
* @ClassName: JeepFactory 
* @Description: TODO
* @author Liu 
* @date 2018年5月26日 下午9:59:06 
*/
public class CarFactory {
    public Car create() {
        return new Car();
    }
}


package com.lh.bean3;

/** 
* @ClassName: Car 
* @Description: 自定义工厂类创建实体,实体创建依赖之前定义的工厂类
* @author Liu 
* @date 2018年5月26日 下午10:04:06 
*/
public class Car {

}


    @Bean
    public CarFactory createCarFactory() {
        return new CarFactory();
    }

    @Bean
    public Car createCar(CarFactory carFactory) {
        return carFactory.create();
    }

四、注解方式

@Controller/@Service/@Repository/@Component

五、@Import方式

package com.lh;

import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

import com.lh.bean.EnableLog;
import com.lh.bean.Role;
import com.lh.bean.User;
import com.lh.exercise.EnableEcho;

/***
 * 
* @ClassName: App 
* @Description: @Import用来导入一个或多个普通类(bean会被spring容器托管),或者配置类(配置类中的bean都会被spring容器托管)
* @author Liu 
* @date 2018年6月10日 下午6:21:28 
*
 */

@ComponentScan
@Import({User.class,Role.class,MyConfiguration.class})
public class App2 
{
    public static void main( String[] args )
    {
        ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
        
        System.out.println(context.getBean(User.class));
        System.out.println(context.getBean(Role.class));
        System.out.println(context.getBeansOfType(Runnable.class));
        
        context.close();
    }
}


package com.lh.bean;

/** 
* @ClassName: Role 
* @Description: TODO
* @author Liu 
* @date 2018年6月10日 下午6:58:55 
*/
public class Role {

}


package com.lh.bean;

/** 
* @ClassName: User 
* @Description: TODO
* @author Liu 
* @date 2018年6月10日 下午6:58:48 
*/
public class User {

}


package com.lh.bean;

import org.springframework.context.annotation.Bean;

/** 
* @ClassName: MyConfiguration 
* @Description: TODO
* @author Liu 
* @date 2018年6月10日 下午7:05:38 
*/
public class MyConfiguration {
    @Bean
    public Runnable createRunnable() {
        return () -> {};
    }
    
    @Bean
    public Runnable createRunnable2() {
        return () -> {};
    }
}

注:

1、@Import用来导入一个或多个普通类(bean会被spring容器托管),或者配置类(配置类中的bean都会被spring容器托管

2、不要在类上加任何注解,否则@Import注解失去意义!

六、通过扫描指定包装载bean

package com.lh;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.lh.bean3.Car;
import com.lh.bean4.Cat;
import com.lh.bean5.Dog;
import com.lh.bean6.Animal;
import com.lh.bean7.User;

/**
 * @ClassName: AnnotationClient
 * @Description: TODO
 * @author Liu
 * @date 2018年5月28日 下午10:42:55
 */
public class AnnotationClient {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("com.lh");
        System.out.println(ctx.getBean("&createJeepFactoryBean"));// name方式

        System.out.println(ctx.getBean(Car.class));

        System.out.println(ctx.getBean(Cat.class));

        System.out.println(ctx.getBean(Dog.class));

        System.out.println(ctx.getBean(Animal.class));
        
        System.out.println(ctx.getBean("myUser"));
        ctx.close();
    }

}

七、指定哪些bean可以装配

package com.lh;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.lh.bean10.UserController;
import com.lh.bean3.Car;
import com.lh.bean4.Cat;
import com.lh.bean5.Dog;
import com.lh.bean6.Animal;

/**
 * @ClassName: AnnotationClient
 * @Description: TODO
 * @author Liu
 * @date 2018年5月28日 下午10:42:55
 */
public class AnnotationClient2 {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AnnotationScan.class);
        System.out.println(ctx.getBean("&createJeepFactoryBean"));// name方式

        System.out.println(ctx.getBean(Car.class));

        System.out.println(ctx.getBean(Cat.class));

        System.out.println(ctx.getBean(UserController.class));
        
        System.out.println(ctx.getBean(Dog.class));
        

        System.out.println(ctx.getBean(Animal.class));
        ctx.close();
    }

}


package com.lh;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;

import com.lh.bean10.UserController;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

/** 
* @ClassName: AnnotationScan 
* @Description: TODO
* @author Liu 
* @date 2018年5月28日 下午10:47:35 
*/
@ComponentScan(basePackages = "com.lh", excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {DogConfig.class,UserController.class}))
@Configuration
public class AnnotationScan {

}


package com.lh;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.lh.bean5.Dog;

/** 
* @ClassName: DogConfig 
* @Description: TODO
* @author Liu 
* @date 2018年5月28日 下午10:53:48 
*/
@Configuration
public class DogConfig {
    @Bean(initMethod = "init",destroyMethod="destroy")
    public Dog createDog() {
        return new Dog();
    }
}


package com.lh.bean10;

import org.springframework.stereotype.Controller;

/** 
* @ClassName: UserController 
* @Description: TODO
* @author Liu 
* @date 2018年5月28日 下午9:46:28 
*/
@Controller//一般用于展现层
public class UserController {

}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
SpringBoot装载bean的几种方式
一、直接装配packagecom.lh.bean;/@ClassName:MyBean@Description:简单直接方式注入bean@authorLiu@date2018年5月26日下午6:21:44/pub
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k