天天看點

Spring配置檔案依賴注入

一、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、集合資料類型

普通資料類型