一、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、集合数据类型
普通数据类型