最代码广告位
sunami的gravatar头像
sunami2014-05-27 19:18:46

Spring mvc+struts2+Hibernate整合实例代码(注解详解)

:使用场景:

(1)由于项目的需要为了提高开发的效率代码简洁,因此项目中部分使用注解来代替xml

(2)项目中使用注解的部分主要是spring依赖注入的那部分使用注解,其它的还是采用xml

(3)注解标签的分类和使用:

:要点分析:

2.1组件注入:

@Service用于标注业务层组件(指的是service层)、

@Controller用于标注控制层组件(如struts中的action)、

@Repository用于标注数据访问组件(指得是数据操作层),即DAO组件。

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。(也就是说它可以代替@Service, @Controller, @Repository但是这样的话就不很难辨清各个层的含义)

2.2组件的属性注入:

@Autowired 是按照类型注入即byType

@Resource是按照名称注入即byName

:案例说明:

<<<<组件注入:

3.1 ProductsDao为持久层接口

@Repository
public class ProductsDaoImpl  implements ProductsDao {

……

}

等价于:

@Repository("productsDaoImpl  ")
public class ProductsDaoImpl  implements ProductsDao {

……

}

注意:@Repository标签通常是放在数据库接口DAO的实现类上面,用于标注这个实现类是一个数据库操作层,它注入到Spring容器的时候这个bean的名字或者是id就是这个类的全名首字母小写,就像上面的例子@Repository和@Repository("productsDaoImpl   ")但是一般开发建议使用默认的即@Repository这样可以避免一些不必要的错误

3.2 ProductsService为业务层接口

@Service
public class ProductsService Impl  implements ProductsService{

……

}

等价于:

@Service("productsServiceImpl ")
public class ProductsService Impl  implements ProductsService{

……

}

注意:@Service标签通常是放在业务层接口Service的实现类上面,用于标注这个实现类是一个业务层即service层,它注入到Spring容器的时候这个bean的名字或者是id就是这个类的全名首字母小写,就像上面的例子@Service和@Service("productsServiceImpl   ")但是一般开发建议使用默认的即@Service这样可以避免一些不必要的错误

 

3.3 ProductsAction为业务层接口

@Controller
public class ProductsAction  extends ActionSupport{

……

}

等价于:

@ Controller ("productsAction ")
public class ProductsAction  extends  ActionSupport{

……

}

注意:@Controller标签通常是放在控制器层上面,用于标注类是一个控制器即action层,它注入到Spring容器的时候这个bean的名字或者是id就是这个类的全名首字母小写,就像上面的例子@Controller和@Controller("productsAction")但是一般开发建议使用默认的即@Controller这样可以避免一些不必要的错误

3.4ProductsAdvice就是一个普通的类实现了一个通知的接口

@Component

public class ProductsAdvice implements MethodBeforeAdvice { 

    public RecordAdvice (){} 

     

    // 调用之前的通知方法 

    public void before(Method method, Object[] args, Object target) 

            throws Throwable { 

        // 得到目标类 

        HunterMan hunter = (HunterMan)target; 

        // 得到目标类的logger 

        Logger logger = Logger.getLogger(target.getClass()); 

        // 打印日志 

        logger.info(hunter.getName()+" did "+method.getName()); 

    } 

注意:@Component的作用泛指所有的组件范围广,可以代表数据库操作层DAO,可以代表业务层即service,可以代表控制器层action,也可以代表的普通的类,区别在于他们都是注入,最后注入到spring容器中,只不过你使用@Service注入的时候spring就知道你这个类是一个业务层的注入,你使用@Repository注入的时候spring知道你这个类是一个数据库操作层,你使用@Controller注入的时候spring知道你这个类是一个控制器,你使用@Component注入的时候他可以理解为只是一个普通的类,因为别的程序使用的时候或者运行的时候需要这个对象所以就将这个对象注入进去了本身这个对象注入的时候没有任何的含义。只是别的程序需要该对象的实例而已。

 

<<<<组件的属性注入:

 

3.2 ProductsService为业务层接口

@Service
public class ProductsService Impl  implements ProductsService{

@Autowired

private ProductDao  ProductDaoImpl;  // 按类型即byType自动注入

}

等价于

@Service
public class ProductsService Impl  implements ProductsService{

@Resource

private ProductDao  ProductDaoImpl;  // 按类型即byName自动注入(ProductDaoImpl这个名称必须和ProductDao 实现类 注入到spring容器的bean的id是一样的)

}

注意:业务层的实现 需要数据库操作层DAO的支持即上面。ProductsService Impl业务层实现需要数据库层DAO即ProductDao  的支持,我们不单单将ProductsServiceImpl注入到spring容器还要把他所需要的对象也注入到Spring容器中,但需要记住他所需要的对象事先是已经注入到spring容器中的,不然的话ProductsServiceImpl对象运行就会报错,因为ProductsServiceImpl他所需要的对象你没有提供给它。


最代码官方编辑于2016-10-11 9:59:22


打赏

顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友