1、本篇博客的背景和目的
目前我本人正在学习SpringFramework的知识,这也是这个专栏的主题。我前面的几篇博文中,简单的认识了一下SpringFramework,记录了SpringFramework的环境搭建,记录了SpringIOC如何加载配置文件,记录了SpringIOC三种Bean对象的实例化方法。还记录了SpringIOC手动装配(注入)的方法之一:set方法注入。还有另外三个不太常用的SpringIOC手动注入的方法。其实目前大部分都使用的是自动注入的方法,手动注入使用的不多。就算是使用手动注入的方法,使用的主流也是:set方法注入。自动注入的方法主要是使用两个注解,@Autowired注解或者是@Resource注解。上一篇博文记录了使用@Resource注解。本篇博客我记录一下使用@Autowired注解。
2、我的上一篇博客
上一篇博客记录了使用@Resource注解实现自动注入的实现方法。链接如下:
SpringIOC自动注入:@Resource注解注入_你是我的日月星河的博客-CSDN博客https://blog.csdn.net/weixin_46281472/article/details/125116299?spm=1001.2014.3001.5501
3、@Autowired注解使用的方法
其实@Autowired注解和@Resource注解的使用方法是一样的。都是使用在私有属性的上方,都需要在XML文件中写上<context:annotation-config/>标签来开启使用注解自动装配的功能。下面我粘贴一张图片大概表示一下@Autowired注解的使用注意:
1、@Autowired注解就是直接看bean标签的class属性的值,这个值跟类字段所属类对应就可以,与属性字段名无关。(这里是和@Resource注解的区别所在,@Resource注解是默认以bean标签的id属性值为准的,如果不一样,那么才会对应class属性值和字段所属类)。
2、使用这个注解的属性可以没有set方法,也可以有set方法。这里我还是强烈建议:所有的实体类的所有属性都加上get()和set()方法。(这个是和@Resource要求一样的)
3、这个注解可以写在类属性的上方,也可以写在set方法的上方(这个和@Resource要求一样)
4、如果类中的属性是接口,这个接口只有一个实现类的话还好说,就直接使用@Autowired注解就可以了,默认注入的就是接口唯一的实现类;但是如果这个接口有多个实现类,那么就需要配合使用另外一个注解:@Qualifier注解,这个注解里面有一个 value属性,将value属性的值设置为对应bean标签的id属性值;这样就可以对得上了;(也就是说:@Resource注解的name属性相当于和@Autowired配套使用的@Qualifier注解的value属性)。
4、我的代码
我的实例代码中并没有使用到一个接口多个实现类的情况,所以我的实例代码中并没有使用到@Qualifier(value="对应XML文件中bean标签的id属性值")这样的代码。在我的上一篇博客里面,也没有使用@Resource(name="对应XML文件中bean标签的id属性值")
其实下面的实例代码就是将我上一篇博客中的@Resource注解换成@Autowired注解就可以了。代码如下(我就不多解释了):
我的POM文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dcy</groupId>
<artifactId>spring04</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring04</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- 这个是Spring框架的核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
简单类UserDao实体类代码:
package com.dcy.dao;
public class UserDao {
public void test(){
System.out.println("这个是内部的UserDao变量");
}
}
使用自动注入注解的UserService类代码:
package com.dcy.service;
import com.dcy.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
public class UserService {
@Autowired
private UserDao userDao;
public void test(){
System.out.println("这个是UserService类内部的test方法");
userDao.test();
}
}
注意上面的代码:将@Autowired使用在了属性的上方,并且这个注解是来自于Spring的。
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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启自动化装备(注入),也就是注解注入 @Autowired或者@Resource-->
<!-- 好处就是我们不需要在手动写 property标签,不需要使用set方法或者是构造器方法
去手动写类里面的参数关系
-->
<context:annotation-config/>
<bean id="userService" class="com.dcy.service.UserService"></bean>
<bean id="userDao" class="com.dcy.dao.UserDao"></bean>
</beans>
Main方法的测试代码:
package com.dcy;
import com.dcy.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Starter {
public static void main(String[] args) {
//首先加载配置文件
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
//获得UserService对象
UserService userService = (UserService) ac.getBean("userService");
//调用方法
userService.test();
}
}
运行结果如下:
5、我的下一篇博文链接?
|