Spring--入門第二天
阿新 • • 發佈:2017-12-03
服務層 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 implementsFactoryBean { 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--入門第二天