码迷,mamicode.com
首页 > 编程语言 > 详细

Spring--入门第二天

时间:2017-12-03 00:28:24      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:基类   name   test   pac   配置   使用   static   需要   抛出异常   

通过工厂方法配置bean

Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象

package yang.mybatis.test;

import org.springframework.beans.factory.FactoryBean;

/**
* Created by yangshijing on 2017/12/2 0002.
*/
public class CarFactoryBean implements FactoryBean {
public String name;

public String brand;

public double price;

public String getBrand() {
  return brand;
}

public void setBrand(String brand) {
  this.brand = brand;
}

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}

public double getPrice() {
  return price;
}

public void setPrice(double price) {
  this.price = price;
}

public Object getObject() throws Exception {
  return new Car(name,brand,price);
}

public Class<?> getObjectType() {
  return Car.class;
}

public boolean isSingleton() {
  return true;
}
}
<bean id="car" class="yang.mybatis.test.CarFactoryBean">
  <property name="brand" value="BM"></property>
  <property name="name" value="jsf"></property>
  <property name="price" value="2131312"></property>
</bean>
  • 创建import org.springframework.beans.factory.FactoryBean接口的实现类
  • class : 指向FactoryBean的全类名
  • propery: 配置FactoryBean的属性
  • 实际返回的实例是FactoryBean的getObject()方法返回的实例

在 classpath 中扫描组件

组件扫描(component scanning): Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件.
特定组件包括:

@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件

对于扫描到的组件, Spring 有默认的命名策略(类似于XML配置中的id): 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称

@Component(value ="car")

当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明 

<context:component-scan>

base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类.;当需要扫描多个包时, 可以使用逗号分隔.

<context:include-filter> 子节点表示要包含的目标类
<context:exclude-filter> 子节点表示要排除在外的目标类

组件装配

  • 使用 @Autowired 自动装配 Bean;<context:component-scan> 元素还会自动注册 AutowiredAnnotationBeanPostProcessor 实例, 该实例可以自动装配具有 @Autowired
  • @Autowired 注解自动装配被SpringIOC容器管理的Bean构造器, 普通字段(即使是非 public), 一切具有参数的方法都可以应用@Authwired 注解
  • 默认情况下, 所有使用 @Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置 @Authwired 注解的 required 属性为 false
  • 默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时(同一个接口的实现类), 通过类型的自动装配将无法工作. 此时可以在 @Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @Qualifiter 已指定注入 Bean 的名称
@Autowired
@Qualifier(value = "userjdbcDaoImp") 
UserDao userDao;

@Autowired
@Qualifier(value = "userXMLDaoImp") 
UserDao userDao;

泛型依赖注入

public class BaseDao<T> {}
public class BaseService<T> {
@Autowired
protected BaseDao<T> baseDao;

public void save(){
System.out.print(baseDao);
}
}
@Component
public class UserDao extends BaseDao<User> {}
@Component
public class UserService extends BaseService<User>{}
public static void main(String[] args){

//1.从classpath路径下的applicationContext.xml文件中获取IOC容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserService userService =(UserService) applicationContext.getBean("userService");

userService.save();

}

控制台输出:*.UserDao@14cd1699

Spring--入门第二天

标签:基类   name   test   pac   配置   使用   static   需要   抛出异常   

原文地址:http://www.cnblogs.com/realshijing/p/7955695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!