以前在使用spring是通过xml来注入的,每次增加一个service 或 dao都要修改xml 文件,现在也赶时髦用注解来实现。
手工装配依赖对象,在这种方式中又有两种编程方式
1. 在xml配置文件中,通过在bean节点下配置,如 <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> <constructor-arg index=“0” type=“java.lang.String” value=“***”/>//构造器注入 <property name=“name” value=“zhao/>//属性setter方法注入 </bean> 第一种方式是在XML里注入的,这有什么不好地方呢?如果我们是在xml文件里进行注入的话,如果bean多的话,那么xml配置文件会很臃肿。 所以Spring在2.0和2.5的时候都给我们提供了一个减肥的方案,就是采用注解的方式来减轻配置文件臃肿的程度。
2. 在java代码中使用@Autowired或@Resource注解方式进行装配。
第一步:在applicationContext.xml进行相应的配置
以下命名空间的配置隐 式注册了多个对注释进行解析处理的处理 器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor.
每个处理器都对应一些注解,好比AutowiredAnnotationBeanPostProcessor这个处理器专门用来解 析@Autowired这个注解的。CommonAnnotationBeanPostProcessor这个处理器专门用来解析@Resource这个 注解的;PersistenceAnnotationBeanPostProcessor这个处理器用来处理持久化方面的注解;。。。。。每个处理器都处 理相应的注解 大家一定要注意一点:注解的本身和XML作用都是一样,用于配置的,它本身并不能干活。 它之所以能干活,是因为在它的背后有这些处理器处理<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="" xmlns:xsi="" xmlns:jee="" xmlns:tx="" xmlns:context="" xsi:schemaLocation=" " default-lazy-init="true"> <description>Spring公共配置文件</description><!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
<context:component-scan base-package="com.jweb" /><!-- 数据源配置,在开发测试环境直连数据库 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mshop" /> <property name="username" value="root" /> <property name="password" value="mysql" /> </bean> <!-- Hibernate配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="namingStrategy"> <bean class="org.hibernate.cfg.ImprovedNamingStrategy" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> </props> </property> <property name="packagesToScan" value="com.jweb.entity.*" /> </bean><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean><!-- 事务管理器配置,单数据源事务 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" /></beans>
这一步关键是就是红色标识的地方。
第二步:在service及dao上使用注解说明这个组件是service还是dao
package com.jweb.service.user;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.jweb.dao.user.UserDao;
import com.jweb.entity.user.User;@Transactionalpublic class UserService {
@Autowired private UserDao mdao;
public UserDao getMdao() { return mdao; } public void setMdao(UserDao mdao) { this.mdao = mdao; } public List<User> findAll(){ return mdao.findAll(); } }
package com.jweb.dao.user;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import com.jweb.entity.user.User;
@Repositorypublic class UserDao {
private SessionFactory sessionFactory;public SessionFactory getSessionFactory() {
return sessionFactory; }//在这里也可以直接注入配置的hibernateTemplate
@Autowired public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory; } @SuppressWarnings("unchecked") public List<User> findAll(){ return sessionFactory.getCurrentSession().createQuery("from User").list(); }}用@service和@Repository只是明确的标识这个是什么类型的类,当然也可以用@Component来标识这个是一个可以注入的组件类。
这样就不在需要在xml文件中配置大量的bean了,是比较方便。在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
//Resource这个注解包的前缀是javax,这是J2EE提供的一个注解,这个注解不属于Spring的 //以后在使用注解方式注入对象的时候建议大家使用这个注解,而不要使用@Autowired注解 //@Autowired是Spring提供的; @Resource是J2EE提供的,在JDK1.6里就存在了 //这两个注解作用都一样,@Resource不属于Spring的,所以她没有跟框架紧密耦合,所以推荐大家使用这个