• Spring笔记系列--2--注解开发相关知识点


    通过前面的文章可以看到,spring框架完成了一个很重要的解耦操作,把数据放到了容器里面,对数据访问层和业务逻辑层和强耦合进行了解耦。但是随之而来的一个问题是:我们使用配置文件的方式来配置的话,会额外做一些配置文件的书写,这样我们的代码量会增多,框架的意义是简化开发。所以spring提供了相应简单的注解方式将数据添加到IOC容器里面。

    原始注解:

      @Component  使用在类上用于实例化Bean

      @Autowired     使用在字段上用于根据类型依赖注入

      @Qualifier   结合@Autowired一起使用用于根据名称进行依赖注入

      @Resource  相当于@Autowired+@Qualifier,按照名称进行注入

      @Value    注入普通属性

      @Scope   标注Bean的作用范围

      @PostConstruct  使用在方法上标注该方法是Bean的初始化方法

      @PreDestroy  使用在方法上标注该方法是Bean的销毁方法

    语义化标签:

      @Controller   和@Component的作用一样,只是在web层类上用于实例化Bean,看到这个注解就知道这是在web层

      @Service    使用在service层类上用于实例化Bean

      @Repository  使用在dao层类上用于实例化Bean

    在使用注解进行开发的时候,需要在配置文件中配置组件扫描,作用是在指定哪个包下及其子包下的bean需要进行扫描以便识别使用注解配置的类、字段和方法

    注解的组件扫描

    <context:component-scan base-package="com.itheima"></context:component-scan>

    使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。

    //@Component("userDao")
    @Repository("userDao")
    public class UserDaoImpl implements UserDao {
       @Override
       public void save() {
      System.out.println("save running... ...");
      }
    @Repository("userDao")小括号中的是这个bean实例在容器中的id名

    使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化,并且将userDao的数据注入进去,有三种注入方式:@Autowired,@Autowired+@Qulifier或者@Resource
    //@Component("userService")
    @Service("userService")
    public class UserServiceImpl implements UserService {
       /*@Autowired
       @Qualifier("userDao")*/
       @Resource(name="userDao")
       private UserDao userDao;
       @Override
       public void save() {
             userDao.save();
      }
    }

    使用@Value进行字符串的注入,在小括号里面使用${jdbc.driver}这种表达式可以读取其他文件的内容注入进去

    @Repository("userDao")
    public class UserDaoImpl implements UserDao {
       @Value("注入普通数据")
       private String str;
       @Value("${jdbc.driver}")
       private String driver;
       @Override
       public void save() {
           System.out.println(str);
           System.out.println(driver);
           System.out.println("save running... ...");
      }
    }

    新注解:

    我们在使用原始注解的时候发现一个问题,我们的原始注解会依赖组件扫描,这样我们的配置文件还是会存在的,所以出现了新注解来将组件扫描之类的操作用注解来完成。

      @Configuration   用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解

      @ComponentScan  用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中 的 <context:component-scan base-package="com.itheima"/>一样

      @Bean      使用在方法上,标注将该方法的返回值存储到 Spring 容器中

      @PropertySource  用于加载.properties 文件中的配置

      @Import      用于导入其他配置类

    @Configuration
    @ComponentScan("com.itheima")
    @Import({DataSourceConfiguration.class})

    public class SpringConfiguration { }

    加载配置文件,将配置注入到类中

    @PropertySource("classpath:jdbc.properties")
    public class DataSourceConfiguration {
       @Value("${jdbc.driver}")
       private String driver;
       @Value("${jdbc.url}")
       private String url;
       @Value("${jdbc.username}")
       private String username;
       @Value("${jdbc.password}")
       private String password;
    }

    将某个方法加载进容器,完成数据访问的相关配置

    @Bean(name="dataSource")
    public DataSource getDataSource() throws PropertyVetoException {
       ComboPooledDataSource dataSource = new ComboPooledDataSource();
       dataSource.setDriverClass(driver);
       dataSource.setJdbcUrl(url);
       dataSource.setUser(username);
       dataSource.setPassword(password);
       return dataSource;
    }

    测试加载核心配置类创建Spring容器

    @Test 
    public void testAnnoConfiguration() throws Exception {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);    
    UserService userService = (UserService)applicationContext.getBean("userService");  
     userService.save();  
     DataSource dataSource = (DataSource)applicationContext.getBean("dataSource");  
     Connection connection = dataSource.getConnection();  
     System.out.println(connection);  
    }

    基于注解的AOP开发

    步骤:

      ①创建目标接口和目标类(内部有切点)
      ②创建切面类(内部有增强方法)
      ③将目标类和切面类的对象创建权交给 spring
      ④在切面类中使用注解配置织入关系
      ⑤在配置文件中开启组件扫描和 AOP 的自动代理
      ⑥测试

    创建目标接口和目标类(内部有切点):

    public interface TargetInterface {
    public void method();
    }
    public class Target implements TargetInterface {
    @Override
    public void method() {
    System.out.println("Target running....");
    }
    }

    创建切面类(内部有增强方法)

    public class MyAspect {
    //前置增强方法
    public void before(){
    System.out.println("前置代码增强.....");
    }
    }

    将目标类和切面类的对象创建权交给 spring,开始操作,类上发生了变化,在接口的实现类和切面类上添加@Component

    @Component("target") 
    public class Target implements TargetInterface {
    @Override
    public void method() {
    System.out.println("Target running....");
    }
    }
    @Component("myAspect")
    public class MyAspect {
       public void before(){
    System.out.println("前置代码增强.....");
    }
    }

    在切面类中使用注解配置织入关系

    @Component("myAspect") 
    @Aspect
    public class MyAspect {
    @Before("execution(* com.itheima.aop.*.*(..))")
    public void before(){
    System.out.println("前置代码增强.....");
    }
    }

    在配置文件中开启组件扫描和 AOP 的自动代理

    <!--组件扫描--> <context:component-scan base-package="com.itheima.aop"/>
    <!--aop的自动代理--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    注解配置AOP详解

    通知的配置语法:@通知注解("切点表达式")

    切点表达式的抽取:

      同 xml配置 aop 一样,我们可以将切点表达式抽取。抽取方式是在切面内定义方法,在该方法上 使用@Pointcut注解定义切点表达式,然后在在增强注解中进行引用

    @Component("myAspect") 
    @Aspect
    public class MyAspect {
    @Before("MyAspect.myPoint()")
    public void before(){
    System.out.println("前置代码增强.....");
    }
    @Pointcut("execution(* com.itheima.aop.*.*(..))")
    public void myPoint(){} }
  • 相关阅读:
    CR655 题解
    International Master 计划试题乱做 part1
    CR604 题解
    用js做分页,点击下一页时,直接跳到了最后一页——Number()的妙用
    RabbitMQ生产者消费者模型(二)
    线程的状态(二)
    Python服务端测试开发训练营
    RabbitMQ环境搭建(一)
    RabbitMQ死信队列机制(七)
    RabbitMQ限流机制(五)
  • 原文地址:https://www.cnblogs.com/Xiaomoml/p/12558884.html
Copyright © 2020-2023  润新知