Spring Beans——接口实例化
一、什么是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));