本文主要是介绍07.注解形式实现IoC-尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
从Java5开始,Java增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。
Spring从2.5版本开始提供了对注解技术的全面支持,我们可以使用注解来实现自动装配,简化Spring的XML配置。
Spring通过注解实现自动装配的步骤如下:
- 引入依赖
- 开启组件扫描
- 使用注解定义Bean
- 依赖注入
格式:@注解名称(属性1=属性值)
-
创建项目包名,如
com.example
,创建xml文件,开启组件扫描<?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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--开启组件扫描--> <context:component-scan base-package="com.example"/> </beans>
-
在
com.example
包下创建User类,添加@component
注解package com.example; import org.springframework.stereotype.Component; @Component public class User { }
情况一:最基本的全扫描方式
<context:component-scan base-package="com.example"/>
情况二:指定要排除的组件
<context:component-scan base-package="com.atguigu.spring6"> <!--context:exc1ude-filter标签:指定排除规则--> <!-- type:设置排除或包含的依据 type="annotation",根据注解排除,expression中设置要排除的注解的全类名 type="assignable",根据类型排除,expression中设置要排除的类型的全类名 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <!--<context:exclude-filter type="assignable" expression="com.atguigu.spring6.controller.Usercontroller"/>--></context:component-scan>
情况三:仅扫描指定组件
<context:component-scan base-package="com.atguigu" use-default-filters="false"> <!--context:inc1ude-fi1ter标签:指定在原有扫描规则的基础上追加的规则--> <!--use-default-fi1ters属性:取值false表示关闭默认扫描规则--> <!--此时必须设置use-defau1t-fi1ters="fa1se",因为默认规则即扫描指定包下所有类--> <!-- type:设置排除或包含的依据 type="annotation",根据注解排除,expression中设置要排除的注解的全类名 type="assignable",根据类型排除,expression中设置要排除的类型的全类名 --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <!--<context:include-filter type="assignable" expression="com.atguigu.spring6.controller.Usercontroller"/>--></context:component-scan>
使用注解定义bean
注解 | 说明 |
---|---|
@Component | 该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如Service层、Dao层等。使用时只需将该注解标注在相应类上即可。 |
@Repository | 该注解用于将数据访问层(Dao层)的类标识为Spring中的Bean,其功能与@Component相同。 |
@Service | 该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。 |
package com.example; import org.springframework.stereotype.Component; @Component(value="user")
public class User {
}
这个写法等价于:
<bean id="user" class="com.example.User"/>
如果只写@Component
,value默认为类名且首字母小写
@Autowired注入
单独使用@Autowired注解,默认根据类型装配。
该注解可以标注在哪里?
- 构造方法上
- 方法上
- 形参上
- 属性上
- 注解上
该注解有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,如果不存在则报错。如果required,属性设置为false,表示注入的Bean存在或者不存在都没关系,存在的话就注入,不存在的话,也不报错。
属性注入方式
-
创建一组MVC架构套件
UserDao.javapackage com.example.autowired.property_injection.dao; public interface UserDao { public void work(); }
UserDaoImpl.java
package com.example.autowired.property_injection.dao; import org.springframework.stereotype.Repository; @Repository public class UserDaoImpl implements UserDao{ @Override public void work() { System.out.println("UserDao-work"); } }
UserService.java
package com.example.autowired.property_injection.service; public interface UserService { public void work(); }
UserServiceImpl
package com.example.autowired.property_injection.service; import com.example.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService{ //属性注入@Autowired UserDao userDao; @Override public void work() { System.out.println("UserService-work"); userDao.work(); } }
UserController.java
package com.example.autowired.property_injection.controller; import com.example.autowired.property_injection.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller public class UserController { //属性注入 @Autowired UserService userService; public void work(){ System.out.println("UserController-work"); userService.work(); } }
-
在bean.xml中开启组件扫描
<?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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--开启组件扫描--> <context:component-scan base-package="com.example"/> </beans>
-
编写测试方法
@Test public void autowiredTest(){ ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml"); UserController userController=applicationContext.getBean(UserController.class); userController.work(); }
-
输出结果
UserController-work
UserService-work
UserDao-work
setter注入方式
//setter注入
@Autowired
public void setUserDao(UserDao userDao) { this.userDao = userDao;
}
创建setter方法,并标上@Autowired
注解即可
构造器注入
//构造器注入
@Autowired
public UserController(UserService userService) { this.userService = userService;
}
形参注入
//形参注入
public UserController(@Autowired UserService userService) { this.userService = userService;
}
只有一个构造函数,无注解
当只有一个有参构造方法时,可以省略@AutoWired注解
@Autowired注解和@Qualifier注解联合
@Service public class UserServiceImpl implements UserService{ @Autowired @qualifier(value="userDaoImpl")UserDao userDao; @Override public void work() { System.out.println("UserService-work"); userDao.work(); } }
使用qualifier注解相当于将默认的根据类型注入改为根据名称注入
@Resource注解
@Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(SR-250标准中制定的注解类型。JSR是ava规范提案。)
高于JDK11或低于JDK8需要引入以下依赖。
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>2.1.1</version>
</dependency>
@Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型onType装配。
@Resource注解能用在属性上、setter方法上。
@Autowired注解能用在属性上、setter方法上、构造方法上、构造方法参数上。
根据名称进行注入
//value项的"value="可省略不写
@Resource(name ="myUserService")
private UserService userService;
@Service("myUserService")
public class UserServiceImpl implements UserService
根据属性名进行注入
@Resource
private UserDao myUserDao;
@Repository("myUserDao")
public class UserDaoImpl implements UserDao
Spring全注解开发
全注解开发指使用一个配置类代替xml配置文件
使用@Confignation
注解表明一个类是配置类
使用@ComponentScan("包名")
可以开启组件扫描
编写测试方法
@Test
public void autowiredCITest() { //要使用AnnotationConfigApplicationContextApplicationContext applicationContext = new AnnotationConfigApplicationContext(myConfig.class); UserController userController = applicationContext.getBean(UserController.class); userController.work();
}
这篇关于07.注解形式实现IoC-尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!