一、 Bean、JavaBean、Spring的Bean区别
- Bean
就是对象
- JavaBean
所有属性均为私有,对属性的访问和修改均需要通过get、set方法,这种类的实例化对象就叫做JavaBean
- Spring Bean
凡是Bean由Spring所管理,并且Bean的整个生命周期过程都在Spring中进行(由Spring生成),存在于Spring容器中的Bean,叫做Spring Bean
二、Spring几种定义Bean的方式
2.1 <bean/>
标签
Spring 读取xml中标签定义的bean,创建对应bean加入到Spring中进行管理
- resources目录下创建spring.xml,定义userBean
<?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 https://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="user" class="com.learning.User.class" />
</beans>
-
使用ClassPathXmlApplicationContext("/spring.xml")读取spring.xml中的bean定义内容
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("/spring.xml");
System.out.println(ac.getBean("user"));
}
}
2.2 @Bean
Spring 会扫描BeanTest中@Bean注解的方法,将方法返回的对象添加到Spring中进行管理
com.test包下建一个类:
public class BeanTest {
@Bean
public User user() {
return new User();
}
}
此时启动,Spring会扫描@Bean注解,将@Bean所标识的bean添加到Spring中进行管理;
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(BeanTest.class);
System.out.println(ac.getBean("user"));
}
}
注意,如果@Bean中不指定beanName,那么方法名是什么,beanName就是什么;
2.3 @Component
@ComponentScan 注解会去扫描指定包下面添加了@Component注解的类,将这样的类定义成Bean添加到Spring中进行管理;生成对应的Bean放到Spring中进行管理
@Component
public class User {
}
@ComponentScan("com.test")
public class BeanTest {
}
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(BeanTest.class);
System.out.println(ac.getBean("user"));
}
}
2.4 BeanDefinition
通过创建BeanDefinition实例,补充bean相关信息,将BeanDefinition加入到Spring中,Spring会根据Beandefinition生成对应的Bean进行管理;
定义BeanDefinition,将其注册到spring中
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
// 定义beanDefinition,
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
// 注册beanDefinition
ac.registerBeanDefinition("user", beanDefinition);
ac.refresh();
System.out.println(ac.getBean("user"));
}
}
2.5 FactoryBean
通过实现 FactoryBean 接口,产生两个Bean,一个是带有&前缀的&beanName对应着FactoryBean实现类的bean,一个是beanName对应着的FactoryBean创建的bean;
增加一个FactoryBean实现,并采用@Component方式注入spring
@Component("user")
public class FactoryBeanDemo implements FactoryBean<Object> {
@Override
public Object getObject() {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
@ComponentScan("com.test")
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(Test.class);
System.out.println(ac.getBean("&factoryBeanDemo")); // factoryBeanDemo的bean实体
System.out.println(ac.getBean("factoryBeanDemo")); // user的bean对象
}
}
2.6 Supplier
类似FactoryBean,不同的是Supplier只会创建一个目标bean,并且可以填充bean的属性;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
ac.registerBean(User.class, new Supplier<User>() {
@Override
public User get() {
User user = new User();
user.setName("自定义注入名称");
return user;
}
});
ac.refresh();
User user = ac.getBean("user", User.class);
System.out.println(user.getName());
}
}