spring-bean(三)

配置方式:通过工厂方法配置bean,通过FactoryBean配置bean

配置形式:基于注解的方式

静态工厂方法

 1 /**
 2  * 静态工厂方法:直接调用某一个类的静态方法就可以返回bean的实例
 3  */
 4 public class StaticCarFactory {
 5     private static Map<String, Car> cars = new HashMap<String, Car>();
 6
 7     static{
 8         cars.put("audi", new Car("audi",123,123));
 9         cars.put("ford", new Car("ford",123,123));
10     }
11
12     public static Car getCar(String name) {
13         return cars.get(name);
14     }
15 }
1    <!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 -->
2     <bean id="car1" class="com.text.StaticCarFactory" factory-method="getCar">
3         <constructor-arg value="audi"></constructor-arg>
4     </bean>

实例工厂方法

 1 /**
 2  * 实例工厂方法:实例工厂的方法,即先需要创建工厂本身,在调用
 3  * 工厂的实例方法,再配置bean的实例
 4  */
 5 public class InstanceCarFactory {
 6
 7     private Map<String, Car> cars = null;
 8
 9     public InstanceCarFactory() {
10         cars = new HashMap<String, Car>();
11         cars.put("audi", new Car("audi",123,123));
12         cars.put("ford", new Car("ford",123,123));
13     }
14
15     public Car getCar(String name) {
16         return cars.get(name);
17     }
18 }
1     <!-- 配置工厂的实例 -->
2     <bean id="carFactory" class="com.text.InstanceCarFactory"></bean>
3     <!-- 通过实例工厂方法来配置bean -->
4     <bean id="car2" factory-bean="carFactory" factory-method="getCar">
5         <constructor-arg value="ford"></constructor-arg>
6     </bean>

用FactoryBean配置bean

 1 //自定义的FactoryBean需要实现提供的接口
 2 public class CarFactoryBean implements FactoryBean<Car> {
 3
 4     private String name;
 5     public void setName(String name) {
 6         this.name = name;
 7     }
 8
 9     @Override
10     public Car getObject() throws Exception {
11         // TODO Auto-generated method stub
12         return new Car(name,5000,500);
13     }
14
15     @Override
16     public Class<?> getObjectType() {
17         // TODO Auto-generated method stub
18         return Car.class;
19     }
20
21     @Override
22     public boolean isSingleton() {
23         // TODO Auto-generated method stub
24         return true;
25     }
26
27
28 }
 1     <!--
 2     通过FactoryBean来配置bean的实例
 3     class=指向FactoryBean的全类名
 4     property=配置FactoryBean的属性
 5
 6     但实际返回的实例确是FactoryBean的getObject方法返回的实例
 7      -->
 8     <bean id="car" class="com.text.CarFactoryBean">
 9         <property name="name" value="bmw"></property>
10     </bean>

基于注解的方式配置bean,装配bean的属性

组建扫描:spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件

1. @Component 基本注解

2. @Respository 持久层

3. @Service 业务层

4. @Controller 表现层

可混用,ioc容器分辨不了,不过建议按层使用,value属性可标示beanName

可增加属性resource-pattern指定扫描的资源。如repository/*.class

可增加子节点

<context:exclude-filter type="annotation" expression=""/> 排除
<context:include-filter type="annotation" expression=""/>  包含(在use-default-filters【不使用默认注解】为false时使用)

expression中可填入如org.springframework.stereotype.Repository等包名

1    <!-- 指定ioc容器扫描的包 -->
2     <context:component-scan base-package="com.rep"></context:component-scan>

实例:autowire自动装配具有兼容类型的单个bean属性

@Controller
public class UserController {
    @Autowire
    private UserService userService;

    public void controller() {
        System.out.println("controller");
        userService.add();
    }
}
@Service
public class UserService {
    public void add() {
        System.out.println("add");
    }
}

此时,就可以打印

controller
add

写到这里,突然产生了一个疑问,注解形式和xml形式是如何转化的

重新写了相同作用的xml

1     <bean id="userController" class="com.rep.UserController" >
2         <property name="userService" ref="userService"></property>
3     </bean>
4
5     <bean id="userService" class="com.rep.UserService"></bean>

在userController中的userService变量需要加上setter方法

运行得出相同结论。然后又产生一个问题,之前为啥用bean来着。。

如果不用bean呢?

1     private UserService userService = new UserService();
2
3     public void controller() {
4         System.out.println("controller");
5         userService.add();
6     }
1   UserController userController = new UserController();
2                 //(UserController)ctx.getBean("userController");
3     userController.controller();

写完对比后,就发现:用bean的原因是为了减少耦合,也就是Controller和Service之间不会产生关系,如果不用bean,Controller中需要new一个Service。而在用spring后,所有的bean都交给ioc容器管理,如果你有需要,跟ioc容器getBean即可。

时间: 2024-10-11 19:23:11

spring-bean(三)的相关文章

Spring bean三种创建方式

spring共提供了三种实例化bean的方式:构造器实例化  静态工厂实例化   动态工厂实例化,下面一一详解: 1.构造器实例化 City.java 1 package com.proc.bean; 2 3 public class City { 4 5 private String name; 6 private String code; 7 8 public City() { 9 } 10 11 public City(String name, String code) { 12 this

Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域

//从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com/hsp/beans.xml" ) ; ac.getBean("beanId"); 当我们去实例化beans.xml,该文件中配置的 bean 就被实例化(不论你用还是不用,bean对象都在那),而且该对象是singleton单例的.(每个bean都有scope属性,可以人为的设

Spring bean的作用域

1.介绍 Spring bean定义时,实际上是创建类实例的配方,这意味着,通过这个配方,即可创建该类的很多对象.Spring框架支持的5种作用域: 2.单例作用域介绍 单例作用域为默认的作用域,单例bean只会产生一个该bean对应的类型的实例对象,对于所有的请求,Spring容器都只会返回一个实例.这个实例被存储在Spring容器的单例池缓存中,之后所有对该bean对象的请求和引用,都将从该单例缓存池中取,而不是再生成新的对象. 但是,需要注意的点是该单例缓存并不是我们之前在设计模式中所了解

Spring Bean的作用域(转)

Spring Bean的作用域 .singleton  [单例] eg:<bean id="personService" class="com.yinger.service.impl.PersonServiceBean" scope="singleton"></bean> 在每个Spring IoC容器中一个bean定义只有一个对象实例. 请注意Spring的singleton bean概念与“四人帮”(GoF)模式一书中

Spring Bean的生命周期(非常详细)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri

Spring8:一些常用的Spring Bean扩展接口

前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP----开闭原则,即: 1.保证对修改关闭,即外部无法修改Spring整个运作的流程 2.提供对扩展开放,即可以通过继承.实现Spring提供的众多抽象类与接口来改变类加载的行为 开卷有益,阅读Spring源码(无需每个类都看得很细,大体流程能梳理出来即可)对于个人水平的提升是帮助非常大

Spring Bean的生命周期(非常详细)(转载)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri

spring bean源码简单解析

最近在看spring的源码,发现看这个还是有点早,看的很吃力,有多东西还不是很明白,像代理等, 我感觉spring用abstract模板来写主要功能,用接口来拓展功能,用的出神入化,但也让很多简单 的东西变得不那么好懂了,就是写的啰嗦了,个人感觉.下面就是下spring bean源码的学习: private static final Resource RETURNS_NULL_CONTEXT = qualifiedResource(CLASS, "returnsNull.xml");

Spring bean注入方式

Spring bean提供了3中注入方式:属性注入,构造方法注入和 1.属性注入: 1 <bean id="dept" class="com.proc.bean.Dept"> 2 <property name="id" value="2"/> 3 <property name="name" value="信息部"></property> 4

转-Spring bean处理-InitializingBean&amp;BeanPostProcessor&amp;BeanFactoryPostProcessor

转自  http://elim.iteye.com/blog/2017466 执行顺序: BeanFactoryPostProcessor.postProcessBeanFactoryUserBean's constructorUserBean 's username property setBeanPostProcessor.postProcessBeforeInitializationInitializingBean.afterPropertiesSetBeanPostProcessor.p