Spring框架:第六章:注解功能

简介: Spring框架:第六章:注解功能

8.1、注解配置Dao、Service、Controller组件

实验32:通过注解分别创建Dao、Service、Controller★

Spring配置bean的常用注解有

@Controller 配置web层的组件

@Service 配置Service层的组件

@Repository 配置Dao层的组件

@Component 除了web层、service层、dao层之外的组件。

@Scope 配置作用域

bean对象

/**
 *  @Component 等价于<br/>
 *  <bean id="book" class="com.pojo.Book" />
 */
@Component
public class Book {}
/**
 *  @Repository 等价于<br/>
 *  <bean id="bookDao" class="com.dao.BookDao" />
 */
@Repository
public class BookDao {}
/**
 *  @Service 等价于<br/>
 *  <bean id="bookService" class="com.service.BookService" />
 */
@Service
public class BookService {}
/**
 *  @Controller 等价于<br/>
 *  <bean id="bookServlet" class="com.controller.BookServlet" />
 */
@Controller
public class BookServlet {}

8.2、指定扫描包时的过滤内容

实验33:使用context:include-filter指定扫描包时要包含的类

实验34:使用context:exclude-filter指定扫描包时不包含的类

<context:include-filter /> 设置包含的内容

注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。即:通过将use-default-filters属性设置为false,

<context:exclude-filter />设置排除的内容

annotation com.XxxAnnotation

过滤所有标注了XxxAnnotation的类。这个规则根据目标组件是否标注了指定类型的注解进行过滤

assignable com.BaseXxx

过滤所有BaseXxx类的子类。这个规则根据目标组件是否是指定类型的子类的方式进行过滤。

applicationContext.xml 中配置的内容如下

<!-- use-default-filters="false" 设置取消默认包含规则 -->
<context:component-scan base-package="com" use-default-filters="false">
  <!-- context:include-filter 设置包含的内容 -->
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  <!-- context:exclude-filter 设置排除的内容 -->
  <context:exclude-filter type="assignable" expression="com.atguigu.service.BookService"/>
</context:component-scan>

以上配置会包含所有@Service注解的类。排除com.service.BookService类

包扫描的排除示例:

<!-- 
  context:component-scan 包扫描
    base-package 设置你要扫描的包,以子包
    base-package="com" 表示Spring会扫描com包,以及它所有子包都会扫描
 -->
<context:component-scan base-package="com">
  <!-- 
    context:exclude-filter 排除某些类
      type="annotation"表示按注解进行排除
      expression 按哪些注解
   -->
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  <!-- 表示按类进行过滤,排除 -->
  <context:exclude-filter type="assignable" expression="com.dao.BookDao"/>
</context:component-scan>

包扫描的包含示例:

<!-- 
  context:component-scan 包扫描
    base-package 设置你要扫描的包,以子包
    base-package="com" 表示Spring会扫描com包,以及它所有子包都会扫描
  use-default-filters="false"禁用默认的包扫描包含规则
    包扫描自定义包含规则一定要结合 use-default-filters="false" 一起使用
 -->
<context:component-scan base-package="com" use-default-filters="false">   
  <!-- 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    按照注解的形式配置包含扫描规则
   -->
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  <context:include-filter type="assignable" expression="com.atguigu.dao.BookDao"/>
</context:component-scan>

8.3、使用注解@Autowired自动装配

实验35:使用@Autowired注解实现根据类型实现自动装配★

@Autowired 注解 会自动的根据标注的对象类型在Spring容器中查找相对应的类。如果找到,就自动装配。

使用@Autowired注解,不需要get/set方法

public class BookService {
  /**
   * @Autowired 配置自动注入
   *  1、先按类型进行查找然后注入。
   */
  @Autowired
  private BookDao bookDao;
  @Override
  public String toString() {
    return "BookService [bookDao=" + bookDao + "]";
  }
}

8.4、多个同类型的bean如何自动装配

实验36:如果资源类型的bean不止一个,默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配★

/**
 *  @Repository 等价于<br/>
 *  <bean id="bookDao" class="com.dao.BookDao" scope="singleton"/>
 */
@Repository
public class BookDao {}
/**
 *  @Repository 等价于<br/>
 *  <bean id="bookDao" class="com.dao.BookDao" scope="singleton"/>
 */
@Repository
public class BookDaoExt extends BookDao{}
/**
 * @Service 等价于<br/>
 * <bean id="bookService" class="com.service.BookService" />
 */
@Service("bookService")
// @Scope("singleton") // 表示单例===不写也一样
@Scope("prototype") // 表示多例
public class BookService {
  /**
   * @Autowired 配置自动注入
   *  1、先按类型进行查找然后注入。<br/>
   *  2、如果按类型查找找到多个,接着做属性名做为id接着查找注入。
   */
  @Autowired
  private BookDao bookDao;
  @Override
  public String toString() {
    return "BookService [bookDao=" + bookDao + "]";
  }
}

8.5、使用@Qualifier装配指定id的bean对象

实验37:如果根据成员变量名作为id还是找不到bean,可以使用@Qualifier注解明确指定目标bean的id★

@Service("bookService") // <bean id="bs" class="com.service.BookService" />
// @Scope("singleton") // 表示单例===不写也一样
@Scope("prototype") // 表示多例
public class BookService {
  /**
   * @Autowired 配置自动注入
   *  1、先按类型进行查找然后注入。<br/>
   *  2、如果按类型查找找到多个,接着做属性名做为id接着查找注入。
   *  @Qualifier("bookDao") 可以设定按照指定的id来进行查找并注入
   */
  @Qualifier("bookDaoExt")
  @Autowired
  private BookDao bookDao2;
  @Override
  public String toString() {
    return "BookService [bookDao=" + bookDao2 + "]";
  }
}

8.6、@Autowired注解的required属性作用

实验39:@Autowired注解的required属性指定某个属性允许不被设置

/**
 * @Autowired 配置自动注入
 *  1、先按类型进行查找然后注入。<br/>
 *  2、如果按类型查找找到多个,接着做属性名做为id接着查找注入。
 *  @Qualifier("bookDao") 可以设定按照指定的id来进行查找并注入
 *  @Autowired(required=true) 表示必须找到一个相应的bean对象注入值。如果找不到,就报错。
 *    如果required=false表示找不到bean对象注入,就值为null
 */
@Qualifier("bookDaoExt2")
@Autowired(required=false)
private BookDao bookDao2;

8.7、@Autowired和@Qualifier在方法上的使用。

实验38:在方法的形参位置使用@Qualifier注解

/**
 * 加入@Autowired的方法在bean对象创建出来之后,就会自动的调用<br/>
 * 加了@Autowired的方法中的参数,会自动的到spring IOC容器中去按类型查找并注入<br/>
 * 如果按类型查找,找到多个。就把参数名做为id接着查找并注入。
 */
@Autowired
public void abc(@Qualifier("bookDao")BookDao bookDaoExt2) {
  System.out.println("这是加了@Autowired的方法...bookDao ==>> " + bookDaoExt2);
}

8.8、泛型注入(了解内容)

实验40:测试泛型依赖注入★

9、Spring的专有测试(了解内容)

@ContextConfiguration

@RunWith

/**
 * 怎么样使用Spring整合Junit的测试(Spring把容器加入到了测试的上下文)
 * 
 */
// 告诉测试,Spring 容器的配置文件在哪
@ContextConfiguration(locations="classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)// 表示使用整合了Spring IOC容器的测试类进行测试
public class SpringTest2 {
  @Autowired
  BookService bookService;
  @Autowired
  UserService userService;
  @Test
  public void test1() throws Exception {
    bookService.saveEntity(new Book());
    System.out.println("=========================");
    userService.saveEntity(new User());
  }
}
相关文章
|
10天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
28 0
|
7天前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
22 3
|
7天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
26 0
|
17天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
41 4
SpringBoot必须掌握的常用注解!
|
18天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
36 2
|
18天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
70 1
|
19天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
34 1
|
14天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
10 0
|
设计模式 开发框架 安全
Spring 功能介绍|学习笔记
快速学习 Spring 功能介绍
111 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。