各种bean区别

一、什么是Beans?

要了解这个问题,我们最好同时看一下这三者:JavaBean, Spring bean 和 POJO

1)JavaBeans
根本而言,JavaBean只是遵循了特定编码规范的Java类而已。例如:
包含默认(无参数)的构造函数
允许通过访问器(getter和setter方法)来访问类的成员属性
实现java.io.Serializable接口

准确来说,JavaBean是遵循了Sun制定的JavaBean 标准的类,该标准最早于1996年发布。JavaBean被定义为Java的“软件组件模型”。最初的想法是将JavaBean打造成能够被构建工具可视化地操作的可重用的组件,由此,软件供应商可以创建和出售能够让用户灵活地组合进应用程序的JavaBean。Java beans规范主要有三点:
a、有一个公有的无参构造器
b、属性可以通过get、set、is(可以替代get,用在布尔型属性上)方法或遵循特定命名规范的其他方法访问
c、可序列化

2)POJO
POJO可以理解为简单的Java对象,该类对象不需要通过框架来使用,也不需要在特定应用服务器的环境下才能运行。这个词主要用来区分简单、轻量的Java对象和“重量级“的类,例如EJB。

3)Spring beans
Spring bean 表示受到Spring管理的对象。具体说来,它是被Spring框架容器初始化、配置和管理的对象。Spring bean是在Spring的配置文件中定义(现在也可以通过annotation注解来定义),在Spring容器中初始化,然后注入到应用程序中。

所以说,Spring最核心的东西是什么,那就非Beans组件莫属了,Bean对于Spring的意义就象OOP对于Java的意义一样。

那么,Spring是如何找到并解析Bean属性的?
1)如果使用注解的方式则Spring在启动初始化的时候会扫描项目classpath下符合要求的class,解析并注册到BeanFactory中
2)如果是xml的方式则是直接通过XmlBeanDefinitionReader解析Bean。现如今基于注解的配置是主流,Spring Boot更是把注解用到了极致。

原文:https://blog.csdn.net/synsdeng/article/details/61614786

二、Spring 实例化bean的三种方式

1)使用构造器实例化bean[set注入],java代码如下:

package test;

public class User {

    private String username;

    public User() {

    }

    public User(String username) {
        this.setUsername(username);
    }

    public void sayHello() {
        System.out.println("hello ");
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

配置文件,代码如下:

<!--方法一:使用构造器实例化bean  -->
<bean id="user" class="test.User"></bean>

测试代码如下:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
        //方法一:使用构造器实例化bean
        User user = (User)applicationContext.getBean("user");
        user.sayHello();

2)使用静态工厂方法实例化bean,java代码如下:

package test;

public class StaticFactory {

    private static StaticFactory staticFactory = new StaticFactory();

    public static StaticFactory getBean() {
        return staticFactory;
    }

    public void say() {
        System.out.println("new Instance!");
    }
}

配置文件,代码如下:

<!--方法二:使用静态工厂方法实例化bean  -->
<bean id="staticFactory" class="test.StaticFactory" factory-method="getBean"/>

测试代码如下:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
        
        //方法二:使用静态工厂方法实例化bean
        StaticFactory staticFactory = (StaticFactory)applicationContext.getBean("staticFactory");
        staticFactory.say();

3)使用实例工厂方法实例化bean,Java代码如下:

package test;

import test.UserDao;
import test.UserDaoImpl;

public class InstanceBean {
    private static UserDao userDaoA = new UserDaoImpl();

    // 该方法必须是非静态的
    public UserDao getBeanInstance() {
        return userDaoA;
    }
}
package test;

//接口UserDao
import test.User;

public interface UserDao {
    public void add(User user);
    public void findByid(String id);
}
package test;

public class UserDaoImpl implements UserDao {

    private String hello;
    
    public void add(User user) {
        System.out.println("最爱西红柿炒鸡蛋!");
    }
    
    public void findByid(String id) {

    }

    public String getHello() {
        return hello;
    }

    public void setHello(String hello) {
        this.hello = hello;
    }
}

配置文件,代码如下:

<!--方法三:使用实例工厂方法实例化bean  -->
  <bean id="instanceBean" class="test.InstanceBean"/>
  <bean id="userDaoA" factory-bean="instanceBean" factory-method="getBeanInstance"></bean>

测试代码,如下:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
        //方法三:使用实例工厂方法实例化bean
        UserDao userDao = (UserDao)applicationContext.getBean("userDao");
        String username = "pppp";
        userDao.add(new User(username));



作者:莫问以
链接:https://www.jianshu.com/p/d4d5ff7b880a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值