软件编程
位置:首页>> 软件编程>> java编程>> JavaBean和SpringBean的区别及创建SpringBean方式

JavaBean和SpringBean的区别及创建SpringBean方式

作者:丶_62f3  发布时间:2022-05-23 03:32:14 

标签:JavaBean,SpringBean

一:对象,JavaBean,SpringBean的区别

1.什么是JavaBean

javaBean要求所有属性为私有,该类必须有一个公共无参构造函数,private属性必须提供公共的Getter setter给外部访问


/**
* @author yzh
* @date 2021/4/29 8:42
**/
public class User {
   //javaBean要求所有属性为私有,该类必须有一个公共无参构造函数,private属性必须提供公共的Getter setter给外部访问
   private String name;
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
}

2.什么是SpringBean

SpringBean是受Spring管理的对象,所有能受Spring管理的对象都可以是SpringBean

3.SpringBean和JAVABean的区别

  • 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean

  • 写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法;但spring中的bean只需为接受设值注入的属性提供setter方法

生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期;spring中的bean有spring管理其生命周期行为

二:如何定义一个SpringBean

准备工作:引入Spring依赖包


<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>5.2.14.RELEASE</version>
</dependency>

1.通过ClassPathXmlApplicationContext

通过ClassPathXmlApplicationContext需要指定configLocation,所有我们现在resources目录下新建一个Spring.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" xmlns:p="http://www.springframework.org/schema/p"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
   <!-- 使用设值注入方式装配实例 -->
   <bean id="user1" class="org.example.bean.User">
       <property name="name" value="zhangsan" />
   </bean>
   <!-- 使用构造方法装配实例 -->
   <!--使用构造方法装配需要在相应类提供构造函数-->
   <bean id="user2" class="org.example.bean.User">
       <constructor-arg index="0" value="lisi" />
   </bean>
</beans>

同时相应对象重写toString方法,便于更好观察user1和user2


package org.example.bean;
/**
* @author yzh
* @date 2021/4/29 8:42
**/
public class User {
   //javaBean要求所有属性为私有,该类必须有一个公共无参构造函数,private属性必须提供公共的Getter setter给外部访问
   private String name;
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public User(String name) {
       this.name = name;
   }
   public User() {
   }
   @Override
   public String toString() {
       return "User{" +
               "name='" + name + '\'' +
               '}';
   }
}

运行测试类


package org.example.bean;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author yzh
* @date 2021/4/29 8:45
**/
public class Main {
   public static void main(String[] args) {
       ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext();
       classPathXmlApplicationContext.setConfigLocation("Spring.xml");
       classPathXmlApplicationContext.refresh();
       User user1 = classPathXmlApplicationContext.getBean("user1",User.class);
       System.out.println(user1);
       User user2 = classPathXmlApplicationContext.getBean("user2", User.class);
       System.out.println(user2);
   }
}

运行结果如下

User{name='zhangsan'}

User{name='lisi'}

2.通过AnnotationConfigApplicationContext底层

也是通过BeanDefinition实现

*@Bean@Component@Service@Controller都可以;一般@Service用于Service层,@Controller用于Controller层,此处以@Bean为例

新建一个Config类,并给User打上@Bean标签


package org.example.bean;
import org.springframework.context.annotation.Bean;
/**
* @author yzh
* @date 2021/4/29 9:20
**/
public class Config {
   @Bean
   public User user(){
       return  new User();
   }
}

通过AnnotationConfigApplicationContext获取bean,并打印bean对象


package org.example.bean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author yzh
* @date 2021/4/29 8:45
**/
public class Main {
   public static void main(String[] args) {
       AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
       annotationConfigApplicationContext.register(Config.class);
       annotationConfigApplicationContext.refresh();
       User user = annotationConfigApplicationContext.getBean("user",User.class);
       System.out.println(user);
   }
}

运行结果

User{name='null'}

3.通过BeanDefinition


package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author yzh
* @date 2021/4/29 8:45
**/
public class Main {
   public static void main(String[] args) {

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();

AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
       //定义一个Bean
       beanDefinition.setBeanClass(User.class);
       //把生成的Bean注册到容器中
       annotationConfigApplicationContext.refresh();
       annotationConfigApplicationContext.registerBeanDefinition("userTest",beanDefinition);
       User userTest = annotationConfigApplicationContext.getBean("userTest", User.class);
       System.out.println(userTest);
   }
}

运行结果

User{name='null'}

4.通过FactoryBean

4.1通过FactoryBean与注解方式

首先新建一个Person类


package org.example.bean;
import org.springframework.stereotype.Component;
/**
* @author yzh
* @date 2021/4/29 10:00
**/
public class Person {
}

然后新建一个PersonFactoryBean类,并实现FactoryBean接口,重写其方法,为其打上@component注解, 此处和在Person类上打注解是同一效果


package org.example.bean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
/**
* @author yzh
* @date 2021/4/29 10:01
**/
@Component("person")
public class PersonFactoryBean implements FactoryBean {
   @Override
   public Object getObject() throws Exception {
       return new Person();
   }
   @Override
   public Class<?> getObjectType() {
       return Person.class;
   }
}

其次添加一个Config类打上@ComponentScan("org.example.bean"),目的是为了扫描包下的注解


package org.example.bean;
import org.springframework.context.annotation.ComponentScan;
/**
* @author yzh
* @date 2021/4/29 9:20
**/
@ComponentScan("org.example.bean")
public class Config {
}

最后通过AnnotationConfigApplicationContext获取Bean


package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author yzh
* @date 2021/4/29 8:45
**/
public class Main {
   public static void main(String[] args) {
        //Config类为包扫描配置类
       AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);
       Person person = annotationConfigApplicationContext.getBean("person", Person.class);
       System.out.println(person);
   }
}

运行结果

org.example.bean.Person@28ac3dc3

4.2通过Factory和BeanDefinition

1.同4.1一样新建一个Person类

2.同4.1一样新建一个PersonFactoryBean类,实现FactoryBean接口,但是不打注解

3.通过BeanDefinition获取对象

此处和注解生成的差别在于通过BeanDefinition注册的会生成两个Bean对象,一个是person对应的类型是Person,另一个是&person对应的类型是PersonFactoryBean,通过下面代码的getBean方法可以看出来!!


package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author yzh
* @date 2021/4/29 8:45
**/
public class Main {
   public static void main(String[] args) {

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);

AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
       ////定义一个Bean
       beanDefinition.setBeanClass(PersonFactoryBean.class);
       //把生成的Bean注册到容器中
       //annotationConfigApplicationContext.refresh();
       //此处会生成2个Bean对象 第一个对象为&person对应的类型的PersonFactoryBean 第二个对象为person对应的类型为Person;
       annotationConfigApplicationContext.registerBeanDefinition("person",beanDefinition);
       PersonFactoryBean personFactoryBean = annotationConfigApplicationContext.getBean("&person", PersonFactoryBean.class);
       System.out.println(personFactoryBean);
       Person person = annotationConfigApplicationContext.getBean("person", Person.class);
       System.out.println(person);
   }
}

运行结果如下

org.example.bean.PersonFactoryBean@3aeaafa6

org.example.bean.Person@76a3e297

FactoryBean接口提供三个方法,但是我们重写了两个方法,这是因为另外一个方法是默认实现了的

FactoryBean接口方法如下:


package org.springframework.beans.factory;
import org.springframework.lang.Nullable;
public interface FactoryBean<T> {

String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
   @Nullable
   T getObject() throws Exception;

@Nullable
   Class<?> getObjectType();
   //默认实现方法,是否是单例
   default boolean isSingleton() {
       return true;
   }
}

5.通过Supplier


package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.function.Supplier;
/**
* @author yzh
* @date 2021/4/29 8:45
**/
public class Main {
   public static void main(String[] args) {

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
       annotationConfigApplicationContext.refresh();
       annotationConfigApplicationContext.registerBean(User.class, new Supplier<User>() {
           @Override
           public User get() {
               User user = new User();
               user.setName("123");
               return user;
           }
       });
       User user = annotationConfigApplicationContext.getBean("user", User.class);
       System.out.println(user);
   }
}

bean的注入方式本文只是提供了多种api,很多情况下底层其实用的都是一样的东西,只是提供了不同的使用方式,具体可以通过源码查看。

来源:https://www.jianshu.com/p/2e6e07e59599

0
投稿

猜你喜欢

  • 背景传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着
  • log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影
  • 本文实例讲述了java获取百度网盘真实下载链接的方法。分享给大家供大家参考。具体如下:目前还存在一个问题,同一ip在获取3次以后会出现验证码
  • 利用Jconsole工具查看程序的资源占用请求。安装jdk时bin目录有jconsole.exe工具,或者通过 Win + R,输入jcon
  • springboot微服务内置了tomcat,在工程目录下执行:mvn clean package,可以将项目打成jar,通过java -j
  • java中javaBean与Bean的深入理解JavaBean 是Java中的一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点
  • 缘起经过前面三章的入门,我们大概了解了Mybatis的主线逻辑是什么样子的,在本章中,我们将正式进入Mybatis的源码海洋。Mybatis
  • 本文实例讲述了java实现日期拆分的方法。分享给大家供大家参考。具体如下:如:计算6-1至6-5之间的日期天数及具体日期,预期的结果是得到:
  • 使用限制JDBC未支持列表Sharding-JDBC暂时未支持不常用的JDBC方法。DataSource接口不支持timeout相关操作Co
  • 一、题目描述题目实现:在进行网络编程时,由于进行网络连接是比较消耗资源的,因此,可以对连接的等待时间进行设置,如果在规定的时间没有进行连接,
  • 协变协变概念令人费解,多半是取名或者翻译的锅,其实是很容易理解的。比如大街上有一只狗,我说大家快看,这有一只动物!这个非常自然,虽然动物并不
  • 导语在使用flutter 自带图片组件的过程中,大家有没有考虑过flutter是如何加载一张网络图片的? 以及对自带的图片组件我们可以做些什
  • 本文实例讲述了Java深度复制功能与用法。分享给大家供大家参考,具体如下:写在前面:什么是深度复制?在Java里面,在创建一个对象,我们通常
  • 今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。P
  • 本文实例讲述了Java基于享元模式实现五子棋游戏功能。分享给大家供大家参考,具体如下:一、模式定义享元模式,以共享的方式高效地支持大量的细粒
  • 为什么要自定义缓存注解?Spring Cache本身提供@Cacheable、@CacheEvict、@CachePut等缓存注解,为什么还
  • 成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的。下面就让我们来看看代码编写的30条建议吧。(1) 类名首字母应该大写。字段
  • 一,FileWritter写入文件FileWritter, 字符流写入字符到文件。默认情况下,它会使用新的内容取代所有现有的内容,然而,当指
  • 本文实例为大家分享了java制作简单验证码的具体代码,供大家参考,具体内容如下在这里我们需要用到java的画笔工具,所以我们需要导入以下包i
  • 一. Window 分类应用 Window(ApplicationWindow: 对应一个 Acitivity)    
手机版 软件编程 asp之家 www.aspxhome.com