1 什么是注解
注解是代码中特殊的标记,格式如下:
@注解名称(属性名称=属性值,属性名称=属性值......) 1
注解可以作用在类、方法、属性上,在上一节中,我们对IOC与解耦合有了深刻的理解,并对基于xml配置的方式操作Bean也有了一定认识。可以体会到,当bean足够多时,配置xml就会变得很麻烦!而使用注解的目的就是为了能够简化xml配置。
Spring针对Bean管理中创建对象提供注解, 以下四个注解都可以用来创建bean实例,只是为了便于开发者清晰区分当前层:
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository
2 基于注解方式实现对象的创建
Demo演示:
1.引入依赖, 除了上节IOC操作中的四个jar包以外,还需要导入spring-aop-5.2.6.RELEASE.jar ,文末提供相关资源下载链接。
2.导入名称空间
3.开启组件扫描: 告诉Spring容器哪些类需要使用注解。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xsd"> <!--开启组件扫描--> <!-- 1.扫描多个包 可以用逗号隔开 2.也可以扫描上层目录 --> <context:component-scan base-package="com.ithxh.spring5"></context:component-scan> </beans>
4.创建类,并添加注解。 注解中的Value值可以省略,若省略,默认为类名首字母小写的值。
import org.springframework.stereotype.Component; /** * @author 兴趣使然黄小黄 * @version 1.0 */ @Component(value = "userService") //<bean id="userService" class="..."/> public class UserService { public void doAnyThing(){ System.out.println("doing..."); } }
5.尝试调用方法。
public class TestDemo { @Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = context.getBean("userService", UserService.class); userService.doAnyThing(); } }
3 组件扫描配置的细节
可以对组件扫描进行个性化配置。
示例一:设置扫描的内容
<context:component-scan base-package="com.ithxh.spring5" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
use-default-filters=“false”表示不使用默认filters,默认情况下是扫描当前基本包下所有类的注解。
context:include-filter,用于设置扫描哪些内容。
示例一中的代码表示扫描com.ithxh.spring5下包的类中Controller注解内容。
示例二:设置不扫描的内容
<context:component-scan base-package="com.ithxh.spring5"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
示例二中默认扫描当前包下所有内容,但是 context:include-filter,用于设置不扫描哪些内容, 因此,不会扫描Controller注解内容。
4 基于注解实现属性的注入
4.1 几种注解概述
针对对象类型的注入相关注解如下:
- @Autowired:根据属性类型进行自动装配。
- @Qualifier:根据属性名称进行注入。通过设置value属性值。
- @Resource:可以根据类型,可以根据名称注入。如果设置了name属性值,则是根据名称注入。但是与前两种的区别是,该注解是在javax扩展包中的,因此Spring更推荐使用前两种注解。
注入普通类型的相关注解:
@Value:注入普通属性。
4.2 @Autowire注解演示
@Autowired 注解Demo演示
0.准备!创建UserService、UserDao、UserDaoImpl,其中UserDaoImpl是UserDao接口的实现类
1.完成UserService和UserDao对象的创建,在两个类上添加注解。
2.在UserService中添加UserDao类型属性,并在该属性上使用注解完成在service注入dao对象。
需要注意,不要给多个Dao实现类添加注解,否则自动装配会引发异常!Spring并不知道该给哪个类进行装配(类型相同)
(我帮你试过了,害不害怕!先往下看,解决方法一会儿说)
完整代码及测试如下:
UserService.java
import com.ithxh.spring5.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserDao userDao; public void doAnyThing(){ System.out.println("UserService doing..."); userDao.add(); } }
UserDao.java
public interface UserDao { public void add(); }