`

Spring 注解的配置的细节

阅读更多

一.  spring注解

1.准备工作
(1)导入common-annotations.jar
(2)导入schema文件 文件名为spring-context-2.5.xsd
(3)在xml的beans节点中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans  
       .......
       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation=" 
           .......
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd"  >

.....
   <!--将针对注解的处理器配置好  -->
  <context:annotation-config /> 
.....
<beans>

2.在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是:
@Autowired默认按类型装配,@Resource默认按名称装配,当找不到名称匹配的bean才会按类型装配。


默认注解
@Resource  private PersonDao persondao;
<bean id="personDao" class="com.hf.dao.impl.PersonDaoBean"></bean>
首先是判断persondao是否与xml里的personDao名字相同,相同则注入,
不同则判断persondao是否是com.hf.dao.impl.PersonDaoBean类型,是则注入不是则返回null.

@Resource(name="personDao")  private PersonDao dao;
<bean id="personDao" class="com.hf.dao.impl.PersonDaoBean"></bean>
判断name名称是否与bean中id相同不同则返回null

Spring自带注解方式
@Autowired @Qualifier("personDao") private PersonDao persondao;
默认是按类型注入  加上@Qualifier("personDao")则按名称注入

3.通过在classpath 自动扫描方式把组件纳入spring容器中管理
spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component @Service @Controller @Repository
注解的类,并将这些类纳入进spring容器中管理。它们的作用和xml文件中使用bean 节点配饰组件是一样的。
(1)使用到了注解的功能(需要注解准备工作的内容)
(2)在xml中加入 
<context:component-scan base-package="com.hf" />
其中base-package 为需要扫描的包(包含子包)
(3)
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件 ,即DAO 组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

(4)
业务类
@Service
public class PersonServiceBean implements PersonService {.....}
输出类
AbstractApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService= (PersonService)cxt.getBean("personServiceBean");
System.out.println(personService);
cxt.close();
使用注解中bean的id默认名称为类名称的首字母小写名称
--------------------------------------------------
自己指定名称
@Service("aa") //默认作用域范围 是单例范围
public class PersonServiceBean implements PersonService {.....}
输出类
AbstractApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService= (PersonService)cxt.getBean("aa");
System.out.println(personService);
cxt.close();
--------------------------------------------------
@Service("aa") @Scope("prototype")//修改bean的作用域
public class PersonServiceBean implements PersonService {....}


-----------------------------------------------------------
   @PostConstruct 
   public void init(){  
    System.out.println("初始化");
   } 
   @PreDestroy 
   public void destory(){   
    System.out.println("释放资源");
   }

4.AOP注解方式
(1)准备工作:
.导入common-annotations.jar  aspectjrt.jar aspectweaver.jar cglib-nodep-2.13.jar
.导入schema文件 文件名为spring-aop-2.0.xsd
.在xml的beans节点中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans  
       .......
       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation=" 
           .......
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"  >

.....
    <!-- 配置解释处理器 为@AspectJ注解提供支持  -->
  <aop:aspectj-autoproxy />
.....
<beans>

(2)
<bean id="myInterceptor" class="com.hf.service.impl.MyInterceptor"></bean>
<bean id="personService" class="com.hf.service.impl.PersonServiceBean" ></bean>
将切面和被拦截的类交给spring管理
(3)切面类

@Aspect //定义切面类
public class MyInterceptor {
   /**
    *  @Pointcut("execution(* com.hf.service..*.*(..))")表达式含义
    * 第一个* 表示返回值类型为任意类型
    * com.hf.service..  两个点表示包路径下的子包的类也要拦截
    * com.hf.service..*.* 子包的所有类中的所有方法 第一个*是方法第二个*是类
    * (..)代表方法参数随意 可有可无可多可少
    * **/

   @Pointcut("execution (* com.hf.service.impl.PersonServiceBean.*(..))")// 定义切入点
   private void andMethod()//声明一个切入点 
   {}
   
/*   @Before("andMethod()")
   public void doAccessCheck(){
    System.out.println("前置通知");    
   }
   */
   
   @Before("andMethod() && args(name)") //带参数 只拦截符合参数类型的方法
   public void doAccessCheck(String name){
    System.out.println("前置通知"+name);    
   }
   
   
/*   @AfterReturning("andMethod()")
   public void doFaterReturning(){    
    System.out.println("后置通知");
   }*/
   
   @AfterReturning(pointcut="andMethod()",returning="result")//带返回值的 无返回值的方法 result为null
   public void doFaterReturning(String result){//拦截方法执行后 获取返回值对象
    System.out.println("后置通知:"+result);
   }
   
   
   @After("andMethod()")
   public void doAfter(){
    System.out.println("最终通知");  
   }
   
/*   @AfterThrowing("andMethod()")
   public void doAfterThrowing(){    
    System.out.println("例外通知");
   }*/
   
   @AfterThrowing(pointcut="andMethod()" , throwing="e") //获取例外并打印
   public void doAfterThrowing(Exception e){   
    System.out.println("例外通知:"+e);
   }
   
   
   @Around("andMethod()")//环绕通知
   public Object doBasecProfiling(ProceedingJoinPoint pjp )throws Throwable{
   //if(){//判断是否与权限
    System.out.println("进入通知");
    Object result = pjp.proceed();
    System.out.println("离开 通知");
   //}
    return result;
    
    
   }
}

(4)业务类 PersonServiceBean 
public class PersonServiceBean implements PersonService {

 public void save(String name){
      throw new RuntimeException("纯属例外");
      // System.out.println("我是Save方法"+name);
    }
 public String update() {  
  return "我是update方法";
 }
}

分享到:
评论

相关推荐

    使用Spring的注解方式实现AOP的细节

    以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...

    spring注解+spring data jpa文档+JPA文档.rar

    文档"spring注解完整版"可能涵盖了Spring框架中所有可用的注解及其用法,对于理解和掌握Spring框架的注解配置非常有帮助。"spring data jpa官方文档中文翻译"则提供了Spring Data JPA的详细指南,包括其设计原理、...

    s2sh+springSecurity的注解配置例子

    标题 "s2sh+springSecurity的注解配置例子" 提供了一个关于整合Spring Security与Struts 2(S2)和Hibernate(SH)框架的注解配置实践的线索。这通常涉及到在Java web应用程序中创建一个安全的环境,通过利用Spring ...

    使用注解方式配置的spring_mvc_3.0

    例如,在使用JPA注解配置ORM映射时,如果实体类属性与数据库字段名称和类型一致,那么几乎无需编写任何额外的映射信息,反射机制将自动处理这些细节。 2. **增强程序内聚性**:将配置信息与Java代码放在同一个文件...

    spring 注解事务管理

    以下是对"spring注解事务管理"这一主题的详细解释。 ### 1. Spring事务管理的基本概念 Spring事务管理主要分为两种方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编写代码来控制事务的开始、提交、...

    spring 注解开发说明

    这种方式使得开发者可以更加专注于业务逻辑,而无需关心复杂的配置细节。 ##### 注解概述 - **`@Component`**: 标记类作为组件,是Spring的基本注解,用于定义泛型的组件。 - **`@Repository`**: 用于标记数据访问...

    spring注解开发总结.pdf

    本文档是关于Spring注解开发的总结,涵盖了Spring开发的核心概念,如IOC(控制反转)、DI(依赖注入)、AOP(面向切面编程)和事务管理等,以及与传统的XML配置方式相比的差异和优势。文档通过实际的注解例子来解释...

    spring注解整合hibernate

    至此,我们完成了Spring注解与Hibernate的整合。这个过程使得开发人员可以专注于业务逻辑,而无需过多关注数据访问层的细节。在实际项目中,还可以进一步优化,比如使用JPA(Java Persistence API)替换Hibernate,...

    spring4注解

    #### 二、Spring注解图示与分类 ##### 2.1 Spring-Context 模块的注解图 - **@Component**: 用于标记任何Java类作为Spring中的一个组件。该注解通常配合`&lt;context:component-scan&gt;`使用,以便Spring能够自动检测和...

    activemq spring 客户端配置

    接收消息通常通过监听器接口实现,如MessageListener,或使用`@JmsListener`注解(Spring 4.1及以上版本)。 5. 负载均衡和容灾:由于ActiveMQ服务器使用Zookeeper进行复制,客户端配置可能需要指定Zookeeper的...

    spring注解

    总的来说,Spring注解提供了一种简洁、直观的方式来管理Bean和依赖注入,让开发者能更专注于业务逻辑,而非配置细节。随着Spring框架的发展,注解配置的应用越来越广泛,成为现代Java企业级应用开发的标准实践之一。

    Spring集成ActiveMQ配置

    下面,我们将深入探讨Spring集成ActiveMQ的具体配置和实现细节。 ### 集成环境 首先,确定所使用的软件版本至关重要。本文中提到的Spring版本为2.5.6,ActiveMQ版本为5.4.2,这两个版本在当时(注意时间背景)是...

    spring-mvc 注解方式xml配置

    虽然我们主要使用注解配置,但仍然需要一个基本的配置来启动Spring MVC。在XML配置中,我们需要声明`DispatcherServlet`并配置`&lt;mvc:annotation-driven&gt;`以启用注解驱动: ```xml &lt;beans xmlns="http://www.spring...

    详解Spring框架注解扫描开启之配置细节

    Spring 框架注解扫描开启之配置细节 Spring 框架提供了灵活的方式来装配 Bean,包括在 XML 中进行显示配置、在 Java 中进行显示配置、隐式的 bean 发现机制和自动装配。自动装配实现需要注解扫描,这时发现了两种...

    spring-mvc注解详情

    注解在Spring MVC中扮演着核心角色,它们提供了声明式编程,使得开发者能够以更简洁的方式配置和控制应用程序的行为。 1. **@Controller**:这个注解标记一个类作为Spring MVC的控制器。控制器类处理来自客户端的...

    Spring+CXF 全注解版

    Spring框架与注解配置** Spring框架提供了多种注解,如`@Component`,`@Service`,`@Repository`和`@Controller`,用于标记类为特定的Spring Bean。这些注解使得无需XML配置,就能将类纳入Spring容器的管理,简化了...

    spring 与 spring mvc 整合 配置讨论

    本文将深入探讨Spring与Spring MVC的整合配置,并结合标签"源码"和"工具"来解析相关的技术细节。 首先,Spring框架的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...

    spring-data-redis基于注解的实现方式

    综上所述,Spring Data Redis通过注解的方式大大简化了与Redis的集成,使得开发人员能够更加专注于业务逻辑,而不需要关心底层缓存的实现细节。这种方式既提高了代码的可读性,也提高了开发效率。在实际项目中,合理...

Global site tag (gtag.js) - Google Analytics