zoukankan      html  css  js  c++  java
  • Spring 注解

    Spring注解

    注解

    Spring提供了一系列的注解来代替配置文件,简化配置
    实际开发中,建议使用注解+配置的形式。

    IOC注解

    步骤

    • 定义组件
    • 扫包
    <context:component-scan base-package="ioc"/>
    <context:component-scan base-package="com.itany.aciton"/>
    <context:component-scan base-package="com.itany.dao.impl"/>
    <context:component-scan base-package="com.itany.service.impl"/>
    

    组件的定义

    • @Componet 定义Bean组件, 添加到ioc容器中,不区分组件类型。
    • @Respsotiry 表示Dao组件
    • @Service 表示Service组件
    • @Controller 表示Action组件

    数据的装配

    注解类型的数据装配是使用属性进行注入,不是setter方法进行注入,所以可以没有setter方法。
    
    • 注入
    @Value("666")
    private int number;
    
    @Value("true")
    private  boolean falg;
    
    @Value("${info.username}")
    private String username;
    
    @Value("java.lang.String")
    private Class classzz;
    
    @Value("classpath:ioc/spring.xml")
    private Resource resource;
    

    配置文件 info.properties

    info.username=toms
    

    xml

    <!---扫包 -->
        <context:component-scan base-package="ioc"/>
        <context:component-scan base-package="com.itany.aciton"/>
        <context:component-scan base-package="com.itany.dao.impl"/>
        <context:component-scan base-package="com.itany.service.impl"/>
        <!---读取配置文件 方法1 -->
       <!-- <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
            <property name="location" value="info.properties"/>
         </bean>-->
    
        <!---读取属性文件方法2 -->
        <context:property-placeholder location="info.properties"/>
    
    

    生命周期

    
    @PostConstruct
    public  void  init()
    {
          System.out.println("初始化方法");
    }
    
    @PreDestroy
    public void  destory()
    {
          System.out.println("销毁之前执行的方法");
    }
    

    bean实例化时机

    默认的时候容器启动的时候就初始化,加上@Lazy 就是调用该bean的时候再实例化

    
    @Component
    @Lazy
    public class SpringBean {
    
        @Value("666")
        private int number;
    
      
    }
    

    作用域:

    默认都是单例的,可在类上面配置@Scope来设置是否单例

    @Scope("prototype")
    

    AOP注解

    基于注解方式定义切面

    通知类:

    @Component //加入IOC容器中
    @Aspect //表示切面
    public class logAdvice {
    
    
        // 定义切点表达式
        @Pointcut("execution(* aop.service.impl.*Impl.*(..))")
        public void pc()
        {
    
        }
    
    
        //前置通知
        @Before("pc()")
        public  void  before(JoinPoint point)
        {
              System.out.println("logAdvice.before.Method"+point.getSignature().getName());
        }
    
        //后置通知
        @AfterReturning(value = "pc()",returning = "returnvalue")
        public Object  after(JoinPoint point,Object returnvalue)
        {
    
                 System.out.println("后置通知:Method"+point.getSignature().getName()+"参数"+point.getArgs());
                 return returnvalue;
    
        }
    
      //异常通知
        @AfterThrowing(value = "pc()",throwing ="e")
    
        public void  afterThrowing(JoinPoint joinPoint,Exception e)
        {
              System.out.println("logAdvice.afterThrowing:e:"+e);
    
        }
    //环绕通知
        @Around("pc()")
    
        public Object  Around(ProceedingJoinPoint point)
        {
            Object proceed=null;
            System.out.println("开始事务");
            try
            {
    
    
                proceed=point.proceed();
                  System.out.println("提交事务");
    
            }
            catch (Throwable ex)
            {
    
                  System.out.println("回滚事务");
            }
            return proceed;
        }
    
    }
    

    配置文件

    <!---扫包 -->
    <context:component-scan base-package="aop.service.impl"/>
    <context:component-scan base-package="aop.advice"/>
    <!---自动创建代理并且织入切面 -->
    
    <aop:aspectj-autoproxy/>
    
    

    service及实现类

    public interface UserService {
    
    
        public void login(String username, String password) throws ClassNotFoundException;
    
        public String logout();
    }
    
    @Service("userservice")
    public class UserServiceImpl implements UserService {
        @Override
        public void login(String username, String password) {
    
           /* int i=6/0;*/
              System.out.println("username:"+username+"password:"+password);
    
            
        }
    
        @Override
        public String logout() {
              System.out.println("UserServiceImpl.logout");
            return "bytebyte";
        }
    }
    
    

    main:

     ApplicationContext ac=new ClassPathXmlApplicationContext("aop/spring.xml");
    UserService userService = (UserService) ac.getBean("userservice");
    userService.logout();
    try {
        userService.login("张三","李四");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    
    
  • 相关阅读:
    隐式图回溯法之八皇后问题解答
    试用O(n)来实现求出一个无序数组的中位数
    C++学习第一弹: const 指针 引用答疑
    一道面试题的解答_骑士获得金币问题
    根据已知词表选出好词(直通车)
    python3.5爬虫完成笔趣阁小说的爬取
    关于_水木社区[日经题]_10只狗鉴别1000瓶中哪一瓶药有毒_的解答思路
    数据库想法整合,多表联立交互
    [网络推广]直通车学习
    3行实现模糊匹配
  • 原文地址:https://www.cnblogs.com/lilihai/p/10142077.html
Copyright © 2011-2022 走看看