什么是注解?java
(1)代码里特殊的标记,格式:@注解名称(属性名称=属性值..)spring
(2)能够在类、方法、属性上添加注解。express
使用注解的目的?测试
能够简化xml配置,使程序变得更简洁、优雅.net
注解的运用code
建立对象提供的注解包含如下4个:component
- @Componet
- @Service
- @Controller
- @Repository
特色:上面四个注解的功能都是同样的,均可以用来建立bean实例,建议使用在对应的功能层次中xml
注解 | 含义 |
---|---|
@Component | 最普通的组件,能够被注入到spring容器进行管理 |
@Repository | 做用于持久层 |
@Service | 做用于业务逻辑层 |
@Controller | 做用于表现层,Controller类 |
属性注入提供的注解:对象
- @Autowired
- @Qualifier
- @Resource
- @Value
特色:@Autowired、@Qualifier、@Resource能够用于注入对象类型属性,@Value能够用户注入普通类型的属性。开发
注解 | 含义 |
---|---|
@Autowired | 根据属性类型进行自动装配 |
@Qualifier | 根据属性名称进行注入 |
@Resource | 能够根据属性、名称进行注入 |
@Value | 注入普通类型的属性 |
基于注解实现建立对象
1)引入依赖
<!-- spring-aop--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.8.RELEASE</version> </dependency>
2)开启组件扫描
<?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 https://www.springframework.org/schema/context/spring-context.xsd"> <!--开启组件扫描 base-package属性:设置要扫描的包 --> <context:component-scan base-package="org.leanr.spring5"></context:component-scan> </beans>
3)类上添加注解
package org.leanr.spring5.service; import org.springframework.stereotype.Service; /** * 类上增长建立对象的注解 * - @Componet * - @Service * - @Controller * - @Repository * value属性能够不设置,默认是类的名称,首字母小写, */ @Service(value = "userService") public class UserService { public void add(){ System.out.println("addddddd"); } }
4)编写测试类
package org.leanr.spring5; import org.junit.Test; import org.leanr.spring5.bean.User; import org.leanr.spring5.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestSpring5 { /** * IOC操做Bean管理-注解方式建立对象 */ @Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = context.getBean("userService", UserService.class); System.out.println(userService); userService.add(); } }
测试类执行结果:
org.leanr.spring5.service.UserService@7920ba90 addddddd
组件扫描配置的细节
<!--use-default-filters属性表示:是否开启默认的filter来扫描包下的内容 默认是true,若是设置为false,则须要设置指定的规则 例以下面设置的意思是,注解是@Controller在org.leanr.spring5包下扫描是生效的,其余注解类不会被扫描到 --> <context:component-scan base-package="org.leanr.spring5" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans>
基于注解实现属性的注入
第一步注解方式建立对象
第二步在类中注入外部属性,并添加属性的注解
1)@Autowired
@Service(value = "userService") public class UserService { //注入属性的注解@Autowired,根据属性类型自动装入 @Autowired private UserDao userDao; public void add(){ System.out.println("userService add"); userDao.add(); }
2)@Qualifier
根据属性名称进行注入
/** * UserDao的实现类 */ @Repository(value = "userDaoImpl2") public class UserDaoImpl implements UserDao { public int add() { System.out.println("UserDaoImpl add "); return 1; } }
@Service(value = "userService") public class UserService { //注入属性的注解@Autowired,根据属性类型自动装入 @Autowired @Qualifier(value = "userDaoImpl2") private UserDao userDao; public void add(){ System.out.println("userService add"); userDao.add(); }
3)@Resource
既能够根据类型也能够名称注入
@Service(value = "userService") public class UserService { //注入属性的注解@Autowired,根据属性类型自动装入 //@Autowired //@Qualifier(value = "userDaoImpl2") //@Resource //根据类型注入 @Resource(value="userDaoimpl2") //根据名称注解 private UserDao userDao; public void add(){ System.out.println("userService add"); userDao.add(); }
4)@Value
针对普通类型的属性注入
@Value(value = "zhangsan") private String userName;
纯注解开发
1)建立配置类,替代xml配置文件
package org.leanr.spring5.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; //Configuration,让Spring知道这是个配置类 @Configuration @ComponentScan(basePackages = {"org.leanr.spring5"}) public class SpringConfig { }
2)编写测试类
/** * 彻底注解开发 */ @Test public void test3(){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class); userService.add(); }