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