依赖注入(Dependency Injection)
所谓的依赖注入就是指:在运行期间,由外部容器动态地将依赖对象注入到组件中。
一、注入方式
1、通过构造方法注入
测试代码:
2、通过属性setter方法注入
如二.1
3、使用注解方式注入
在java代码中使用@Autowired或者@Resource注解方式进行装配。这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。需配置xml文件如下:
这种配置隐式注册了多个对注解解析处理的处理器AutowriedAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
使用@Resource注解的业务代码如下:
1)标注在字段上的方式
2)标注在setter方法上的方式
在@Resource中没有指定name属性时,Spring会根据该字段的名称personDao去xml中寻找匹配的bean,假如找不到,再去根据该字段的类型去寻找匹配的bean。
注意:@Resource注解在Spring安装目录的lib\j2ee\common-annotations.jar
使用@Autowired注解的业务代码如下:
二、注入类型
1、基本类型以及集合类型对象注入
测试代码:
2、注入其他bean类型
1)方式一
2)方式二(使用内部bean的方式进行注入,但该bean不能被其他bean使用)
所谓的依赖注入就是指:在运行期间,由外部容器动态地将依赖对象注入到组件中。
一、注入方式
1、通过构造方法注入
package com.bill.impl; import com.bill.PersonService; import com.bill.dao.PersonDao; /** * @author Bill */ public class PersonServiceBean implements PersonService { private PersonDao personDao; private String name; public PersonServiceBean(PersonDao personDao, String name) { this.personDao = personDao; this.name = name; } public void save(){ personDao.add(); System.out.println(name); } }
<bean id="personDao" class=" com.bill.dao.impl.PersonDaoBean"/> <bean id="personService" class="com.bill.impl.PersonServiceBean"> <constructor-arg index="0" type="com.bill.dao.PersonDao" ref="personDao"></constructor-arg> <constructor-arg index="1" value="good"></constructor-arg> </bean>
测试代码:
AbstractApplicationContext act = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService = (PersonService)act.getBean("personService"); personService.save(); act.close();
2、通过属性setter方法注入
如二.1
3、使用注解方式注入
在java代码中使用@Autowired或者@Resource注解方式进行装配。这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。需配置xml文件如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/> <bean id="personDao" class=" com.bill.dao.impl.PersonDaoBean"></bean> <bean id="personService" class="com.bill.impl.PersonServiceBean"></bean> </beans>
这种配置隐式注册了多个对注解解析处理的处理器AutowriedAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
使用@Resource注解的业务代码如下:
1)标注在字段上的方式
package com.bill.impl; import javax.annotation.Resource; import com.bill.PersonService; import com.bill.dao.PersonDao; /** * @author Bill */ public class PersonServiceBean implements PersonService { @Resource private PersonDao personDao; //@Resource(name="personDao") private PersonDao personDao;//采用指定name属性的方式,寻找xml中指定的bean public void save(){ personDao.add(); } }
2)标注在setter方法上的方式
package com.bill.impl; import javax.annotation.Resource; import com.bill.PersonService; import com.bill.dao.PersonDao; /** * @author Bill */ public class PersonServiceBean implements PersonService { private PersonDao personDao; @Resource public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } public void save(){ personDao.add(); } }
在@Resource中没有指定name属性时,Spring会根据该字段的名称personDao去xml中寻找匹配的bean,假如找不到,再去根据该字段的类型去寻找匹配的bean。
注意:@Resource注解在Spring安装目录的lib\j2ee\common-annotations.jar
使用@Autowired注解的业务代码如下:
package com.bill.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.bill.PersonService; import com.bill.dao.PersonDao; /** * @author Bill */ public class PersonServiceBean implements PersonService { //默认按类型装配 @Autowired private PersonDao personDao; //使用@Qualifier("personDao")将@Autowired装配方式改为按名称装配 //@Autowired @Qualifier("personDao") private PersonDao personDao; public void save(){ personDao.add(); } }
二、注入类型
1、基本类型以及集合类型对象注入
public class PersonServiceBean implements PersonService { private String name; private Integer id; private Set<String> sets = new HashSet<String>(); private Map<String, String> maps = new HashMap<String, String>(); private Properties properties = new Properties(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } public Map<String, String> getMaps() { return maps; } public void setMaps(Map<String, String> maps) { this.maps = maps; } public Set<String> getSets() { return sets; } public void setSets(Set<String> sets) { this.sets = sets; } }
<bean id="personService" class="com.bill.impl.PersonServiceBean"> <property name="name" value="bill"/> <property name="id" value="88"/> <property name="sets"> <set> <value>set1</value> <value>set2</value> <value>set3</value> </set> </property> <property name="maps"> <map> <entry key="key1" value="value1"></entry> <entry key="key2" value="value2"></entry> <entry key="key3" value="value3"></entry> </map> </property> <property name="properties"> <props> <prop key="key-1">propValue1</prop> <prop key="key-2">propValue2</prop> <prop key="key-3">propValue3</prop> </props> </property> </bean>
测试代码:
System.out.println("===========set============"); for(String value : personService.getSets()){ System.out.println(value); } System.out.println("===========map============"); for(String key : personService.getMaps().keySet()){ System.out.println(key + "=" + personService.getMaps().get(key)); } System.out.println("===========properties========"); for(Object propsKey : personService.getProperties().keySet()){ System.out.println(propsKey + "=" + personService.getProperties().getProperty((String) propsKey)); }
2、注入其他bean类型
1)方式一
<bean id="personDao" class=" com.bill.dao.impl.PersonDaoBean"/> <bean id="personService" class="com.bill.impl.PersonServiceBean"> <property name="personDao" ref="personDao"></property> </bean>
2)方式二(使用内部bean的方式进行注入,但该bean不能被其他bean使用)
<bean id="personService" class="com.bill.impl.PersonServiceBean"> <property name="personDao"> <bean class=" com.bill.dao.impl.PersonDaoBean"/> </property> </bean>
发表评论
-
w3c解析XML
2011-12-13 20:34 4805XML file <?xml version=&qu ... -
Dom4j解析XML
2011-12-13 20:28 0解析xml文件,输出所有的属性和元素值 解析XML所需最小类 ... -
谈谈类加载器
2011-10-09 16:11 805类加载器 一、简要介绍什么是类加载器和类加载器的作用 1、Ja ... -
Spring学习(六) 通过在classpath自动扫描方式把组件纳入Spring容器中管理
2011-10-04 23:21 959之前我们都是使用XML的bean定义来配置组件,在大项目中,通 ... -
Spring学习(五) Ioc控制反转
2011-10-04 11:35 970所谓的控制反转就是应用本身不负责依赖对象的创建以及维护,依赖对 ... -
Spring学习(三) 如何指定bean的初始化方法和关闭资源方法
2011-10-04 00:12 1308在容器启动时初始化bean,再接着调用初始化方法init(), ... -
Spring学习(二) bean的作用域
2011-10-03 23:58 934一、常用bean的作用域 1.singleton 在每个Spr ... -
Spring学习(一) 三种实例化bean的方式
2011-10-03 23:16 9211.使用类构造器实例化 <bean id=" ... -
Java 将XML和XSL转换成HTML
2011-09-09 21:33 8060将test.xml和test.xsl文件转成test.html ... -
Java 复制文件
2011-09-09 21:19 739利用Java进行文件复制 package bill.co ... -
Java换算 1GB 为多少byte
2011-09-08 21:10 1579左移1位,表示乘以2的一次方,由于1K = 1024 byte ... -
Demo of MySQL for Java
2011-09-04 18:05 1435Java使用MySQL的Demo 1.首先将mysql-con ...
相关推荐
在类或方法上使用`@Autowired`注解可以自动匹配并注入依赖。例如: ```java @Service public class Service { @Autowired private Repository repository; } ``` `@Service`是Spring的组件注解,标记此类为一个...
其次,setter注入是通过在类中声明setter方法,Spring容器会调用这些方法来注入依赖。这种方式更灵活,允许在对象创建后改变依赖,但可能导致对象在不完整状态下被初始化。 为了实现这些注入,我们需要在Spring配置...
这种方式更为灵活,可以在对象创建后任何时候注入依赖。例如: ```java public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } } ``` ...
1. **构造器注入**:通过类的构造方法来注入依赖项。 2. **设值注入**:通过setter方法来注入依赖项。 #### 四、使用注解进行依赖注入 随着Spring框架的发展,除了XML配置之外,Spring还引入了注解的方式来简化...
1. 构造器注入:通过在类的构造函数中传递依赖对象来完成注入。这种方式在创建对象时就确保了所有依赖都已就绪,适合于对象的依赖关系不可变的情况。 2. 设值注入:通过setter方法将依赖对象注入到已经创建的对象中...
接口注入在Spring中较少使用,主要是通过实现特定的接口,由Spring提供实现该接口的方法来注入依赖。这种方式对类的侵入性较大,但可以避免使用setter方法。在实际应用中,更多地会采用构造器注入和设值注入。 ...
1. **构造器注入**:通过在类的构造函数中传递依赖对象的实例,Spring容器会在创建目标对象时调用合适的构造函数并注入依赖。 2. **setter注入**:在类中定义setter方法,Spring容器可以通过调用这些setter方法来...
3. **接口注入**:较少使用,通过实现特定接口来注入依赖,但Spring并不直接支持,通常需要自定义实现。 **Spring的配置方式** Spring提供了多种配置方式: 1. **XML配置**:传统的Spring配置方式,通过`<bean>`...
2. 使用`@Autowired`注解自动匹配和注入依赖。 3. Bean工厂和ApplicationContext管理bean生命周期,BeanDefinition存储bean的元信息。 4. `DefaultListableBeanFactory`和`AutowiredAnnotationBeanPostProcessor`...
Spring会自动调用setter方法来注入依赖。例如: ```java public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { ...
1. **构造器注入**:通过在构造函数中传递依赖对象的实例来实现。 ```java public class MyClass { private Dependency dependency; public MyClass(Dependency dependency) { this.dependency = dependency; ...
Spring可以通过调用setter方法或构造器来注入依赖。 7. **AOP代理(AOP Proxy)** Spring通过AOP代理来实现对Bean的增强,提供事务管理、日志记录等服务。有JDK动态代理和CGLIB代理两种方式,前者适用于接口,后者...
接口注入在Spring中相对较少使用,主要是通过实现特定的接口并由Spring提供实现来注入依赖。这种方式通常适用于需要动态地改变对象的行为,比如AOP代理。 ```java public interface ApplicationContextAware { ...
这种方式更为灵活,因为即使对象已经被创建,也可以动态注入依赖: ```java public class Service { private Repository repository; @Autowired public void setRepository(Repository repository) { this...
在Spring框架中,依赖注入就是利用反射来找到并实例化所需的对象,然后将它们注入到其他对象中。 接下来,我们谈谈注解。注解是元数据的一种形式,可以向编译器或运行时环境提供有关代码的信息。Java中的注解是以`@...
对于非POJO对象或者有特殊初始化需求的对象,Spring提供工厂方法来创建并注入依赖。 6. **@Qualifier注解**: 当有多个相同类型的bean,而我们需要指定具体哪一个时,`@Qualifier`注解可以用来明确指定。 7. **@...
Spring框架通过DI来管理对象的生命周期和对象间的依赖关系,使得开发者无需在代码中硬编码依赖对象的创建和获取。 在Spring框架中,依赖注入有两种主要实现方式:构造器注入和setter注入。 1. 构造器注入:通过在...
3. **接口注入**:Spring通过实现一个接口并在接口中定义setter方法来注入依赖。这种方式相对较少使用,通常用于特殊场景。 **面向切面编程(AOP)** AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以...
这种方式是通过实现特定的接口,由Spring在运行时动态调用接口方法注入依赖。Spring没有内置的接口注入机制,但可以通过实现`InitializingBean`或`DisposableBean`接口来自定义初始化和销毁逻辑。例如: ```java ...