一、Bean的引用注入
1、通過set方法代碼如下
a、這是springContext.xml的配置
<!--工廠的動态執行個體化Bean-->
<bean id="factory" class="com.hkf.fatory.DynamicleFactory"></bean>
<bean id="UserDao" factory-bean="factory" factory-method="getUserDao"></bean>
<!--通過set方法依賴注入UserDao , 注意:set方法名第一個字母大寫要改成小寫如<property name="userDao"-->
<bean id="UserService" class="com.hkf.service.Impl.UserServiceImpl">
<property name="userDao" ref="UserDao"></property>
</bean>
b、Java代碼如下
public class UserServiceImpl implements UserService {
private UserDao userDao;
/**
* 依賴注入
* @param userDao
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void test() {
userDao.save();
System.out.println("這是UserServiceImpl裡面的方法!!");
}
}
c、測試結果
UserDaoIpml什麼時候建立的。
這是一個簡單的方法測試spring容器建立對象!!!
這是UserServiceImpl裡面的方法!!
2、通過構造方法依賴注入
Java代碼如下
public class UserServiceImpl implements UserService {
private UserDao userDao;
/**
* 依賴注入
* @param userDao
*/
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
/**
* 依賴注入通過構造方法注入
* @param userDao
*/
public UserServiceImpl(UserDao userDao){
this.userDao=userDao;
}
/**
* 無參構造
*/
public UserServiceImpl(){
}
public void test() {
userDao.save();
System.out.println("這是UserServiceImpl裡面的方法!!");
}
}
xml檔案配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.hkf.impl.UserDaoIpml"></bean>
<!-- <bean id="UserService" class="com.hkf.service.Impl.UserServiceImpl" p:userDao-ref="userDao"/>-->
<bean id="UserService" class="com.hkf.service.Impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
</beans>
測試代碼
@Test
public void test4(){
ApplicationContext a = new ClassPathXmlApplicationContext("springContext2.xml");
UserService userService = (UserService)a.getBean("UserService");
userService.test();
}
這區間可能出現的問題
/**
*造成空指針的原因是因為直接建立service的實作類對象,service裡面包含了userDao層的對象和方法,UserDao是直接交給對象執行個體化的,是以service調用不到userDao對象
java.lang.NullPointerException
at com.hkf.service.Impl.UserServiceImpl.test(UserServiceImpl.java:22)
at com.hkf.TestSpring.test3(TestSpring.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
*/
@Test
public void test3(){
UserService a = new UserServiceImpl();
a.test();
}
二、Bean的依賴注入的資料類型
上面的操作就是注入的都是引用Bean,除了對象的引用可以注入,普通資料類型,集合都可以在容器中注入;
注入資料的三種資料類型
1、普通資料類型
2、引用資料類型
3、集合資料類型
普通資料類型