1. 程式人生 > >Spring--入門第二天

Spring--入門第二天

服務層 property component system clu ans cep () int

通過工廠方法配置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--入門第二天