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();
}

原文地址:https://www.cnblogs.com/lilihai/p/10142077.html