您现在的位置是:首页 >其他 >Spring第九阶段:Spring的注解功能网站首页其他

Spring第九阶段:Spring的注解功能

DKPT 2023-07-07 12:00:03
简介Spring第九阶段:Spring的注解功能

注解功能

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

通过注解分别创建Dao、Service、Controller
Spring配置bean的常用注解有

@Controller	配置web层的组件	
@Service	配置Service组件
@Repository	配置Dao组件
@Component	配置JavaBean( 除Service , Dao , Controller组件之外的JavaBean )
@Scope						配置单例,或多例
@Scope("prototype") // 表示多例 , 默认不使用@Scope注解表示单例 

如果需要自定义id值. 只需要在注解中直接注入value属性值即可.
在这里插入图片描述
在这里插入图片描述

/**
 *  @Component 注解的作用相当于: <br/>
 *      <bean class="com.atguigu.annotation.Book" id="book"></bean> <br/>
 *      class 属性是当前Bean的全类名 <br/>
 *      id 属性默认是当前类名首字母小写 <br/>
 */
@Component
public class Book {  }

/**
 * @Controller 注解的作用相当于: <br/>
 * <bean class="com.atguigu.annotation.BookController" id="bookController"></bean> <br/>
 *  class 是当前类的全类名 <br/>
 *  id 是类名首字母小写 <br/>
 */
@Controller
public class BookController {  }


/**
 * @Repository注解作用相当于: <br/>
 * <bean class="com.atguigu.annotation.BookDao" id="bookDao"></bean>
 *  class 属性是当前类的全类名 <br/>
 *  id 默认是类名首字母小写 <br/>
 */
@Repository
public class BookDao {  }

/**
 * @Service 注解的作用相当于: <br/>
 *  <bean class="com.atguigu.annotation.BookService" id="bookService"></bean> <br/>
 *   class 属性是当前类的全类名 <br/>
 *   id 属性是当前类名首字母小写 <br/>
 */
@Service
public class BookService {  }

在applicationContext.xml配置文件中加入包扫描才可以使用注解:

<!--
    context:component-scan 表示组件扫描
        base-package 是你要搜索的包.( 也会扫描子包 )
-->
<context:component-scan base-package="com.atguigu"></context:component-scan>

测试

public class SpringTest {

    @Test
    public void test1() {

        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");

        System.out.println(applicationContext.getBean("book"));
        System.out.println(applicationContext.getBean("bookDao"));
        System.out.println(applicationContext.getBean("bookService"));
        System.out.println(applicationContext.getBean("bookController"));

    }

}

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

使用context:include-filter指定扫描包时要包含的类
使用context:exclude-filter指定扫描包时不包含的类
<context:include-filter />	设置包含的内容
<context:exclude-filter />	设置排除的内容

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

applicationContext.xml 中配置的内容如下

<!-- use-default-filters="false" 设置取消默认包含规则 -->
	<context:component-scan base-package="com.atguigu" 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.atguigu.service.BookService类

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

使用@Autowired注解实现根据类型实现自动装配
@Autowired 注解 会自动的根据标注的对象类型在Spring容器中查找相对应的类。如果找到,就自动装配。
使用@Autowired注解,不需要get/set方法

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *
     */
    @Autowired
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
}

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

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

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *  2 如果按类型查找到多个,接着按属性名做为id继续查找并注入 <br/>
     */
    @Autowired
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
}

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

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

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *  2 如果按类型查找到多个,接着按属性名做为id继续查找并注入 <br/>
     *  3 @Qualifier("xxx")注解可以指定一个id到Spring容器中查找并注入 (会忽略属性名) <br/>
     */
    @Qualifier("bookDao")
    @Autowired
    private BookDao bookDaoExt;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDaoExt +
                '}';
    }
}

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

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

@Service
public class BookService {
    /**
     * @Autowired 注解的作用是在Spring容器中查找需要的Bean对象.然后赋值 <br/>
     *  1 先按类型查找,找到一个就注入 <br/>
     *  2 如果按类型查找到多个,接着按属性名做为id继续查找并注入 <br/>
     *  3 @Qualifier("xxx")注解可以指定一个id到Spring容器中查找并注入 (会忽略属性名) <br/>
     *  4 如果@Qualifier("xxx")注解没有按照指定id找到Bean,也可以设置required = false允许字段值为null.
     */
    @Qualifier("bookDao1")
    @Autowired(required = false)
    private BookDao bookDaoExt;

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDaoExt +
                '}';
    }
}

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

在方法的形参位置使用@Qualifier注解

/**
 * @Autowired 注解如果标识在方法上,则Bean对象创建好之后,就会马上调用,一般用于给JavaBean属性初始化赋值 <br/>
 *  1 Spring框架会自动的按参数的类型到Spring容器中按类型查找Bean并传递赋值 <br/>
 *  2 如果按类型找到多个,再按参数名做id继续查找并赋值 <br/>
 *  3 使用@Qualifier("xxx")注解在参数上指定一个id到Spring容器中查找并注入 (会忽略参数名) <br/>
 *  4 如果@Qualifier("xxx")注解没有按照指定id找到Bean,也可以设置required = false允许方法不调用
 */
@Autowired(required = false)
public void abc(@Qualifier("bookDao1") BookDao bookDaoExt1){
    System.out.println("abc() ===>>> " + bookDaoExt1);
    this.bookDaoExt = bookDaoExt1;
}

8、泛型注入

测试泛型依赖注入
在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。