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

 

posted @ 2020-03-24 14:33  码不够的张小墨  阅读(156)  评论(0编辑  收藏  举报