概述
本文章根据b站动力节点spring视频教程整理
视频链接:https://www.bilibili.com/video/BV1nz4y1d7uy
基于注解的di: 通过注解完成java对象创建,属性赋值。
使用注解的步骤:
1.加入maven的依赖 spring-context ,在你加入spring-context的同时, 间接加入spring-aop的依赖。
使用注解必须使用spring-aop依赖
2.在类中加入spring的注解(多个不同功能的注解)
3.在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
学习的注解:
1.@Component
2.@Respotory
3.@Service
4.@Controller
5.@Value
6.@Autowired
7.@Resource
相关代码:
pom.xml
<?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.bjpowernode</groupId>
<artifactId>ch04-di-anno</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
applicationContext.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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--声明组件扫描器(component-scan),组件就是java对象
base-package:指定注解在你的项目中的包名。
component-scan工作方式: spring会扫描遍历base-package指定的包,
把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。
加入了component-scan标签,配置文件的变化:
1.加入一个新的约束文件spring-context.xsd
2.给这个新的约束文件起个命名空间的名称
-->
<context:component-scan base-package="com.bjpowernode.ba01" />
<!--
<bean id="myXueXiao" class="com.bjpowernode.ba03.School">
<property name="name" value="清华大学" />
<property name="address" value="北京" />
</bean>
-->
<!--加载属性配置文件-->
<context:property-placeholder location="classpath:test.properties" />
</beans>
test.properties
myname=u5F20u4E09u975E
myage=20
ba01:
student.java
package com.bjpowernode.ba01;
import org.springframework.stereotype.Component;
/**
* @Component: 创建对象的, 等同于<bean>的功能
* 属性:value 就是对象的名称,也就是bean的id值,
* value的值是唯一的,创建的对象在整个spring容器中就一个
* 位置:在类的上面
*
* @Component(value = "myStudent")等同于
* <bean id="myStudent" class="com.bjpowernode.ba01.Student" />
*
* spring中和@Component功能一致,创建对象的注解还有:
* 1.@Repository(用在持久层类的上面) : 放在dao的实现类上面,
* 表示创建dao对象,dao对象是能访问数据库的。
* 2.@Service(用在业务层类的上面):放在service的实现类上面,
* 创建service对象,service对象是做业务处理,可以有事务等功能的。
* 3.@Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象的,
* 控制器对象,能够接受用户提交的参数,显示请求的处理结果。
* 以上三个注解的使用语法和@Component一样的。 都能创建对象,但是这三个注解还有额外的功能。
* @Repository,@Service,@Controller是给项目的对象分层的。
*
*
*/
//使用value属性,指定对象名称
//@Component(value = "myStudent")
//省略value
@Component("myStudent")
//不指定对象名称,由spring提供默认名称: 类名的首字母小写
//@Component
public class Student {
private String name;
private Integer age;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba01.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest01 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
ba02:
Student.java
package com.bjpowernode.ba02;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("myStudent")
public class Student {
/**
* @Value: 简单类型的属性赋值
* 属性: value 是String类型的,表示简单类型的属性值
* 位置: 1.在属性定义的上面,无需set方法,推荐使用。
* 2.在set方法的上面
*/
//@Value("李四" )
@Value("${myname}") //使用属性配置文件中的数据
private String name;
@Value("${myage}") //使用属性配置文件中的数据
private Integer age;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
//@Value("30")
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba02.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest02 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
ba03:
Student.java
package com.bjpowernode.ba03;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("myStudent")
public class Student {
/**
* @Value: 简单类型的属性赋值
* 属性: value 是String类型的,表示简单类型的属性值
* 位置: 1.在属性定义的上面,无需set方法,推荐使用。
* 2.在set方法的上面
*/
@Value("李四" )
private String name;
private Integer age;
/**
* 引用类型
* @Autowired: spring框架提供的注解,实现引用类型的赋值。
* spring中通过注解给引用类型赋值,使用的是自动注入原理 ,支持byName, byType
* @Autowired:默认使用的是byType自动注入。
*
* 位置:1)在属性定义的上面,无需set方法, 推荐使用
* 2)在set方法的上面
*/
@Autowired
private School school;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
@Value("30")
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
", school=" + school +
'}';
}
}
School.java
package com.bjpowernode.ba03;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("mySchool")
public class School {
@Value("北京大学")
private String name;
@Value("北京的海淀区")
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + ''' +
", address='" + address + ''' +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba03.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest03 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
ba04:
Student.java
package com.bjpowernode.ba04;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
private Integer age;
/**
* 引用类型
* @Autowired: spring框架提供的注解,实现引用类型的赋值。
* spring中通过注解给引用类型赋值,使用的是自动注入原理 ,支持byName, byType
* @Autowired:默认使用的是byType自动注入。
*
* 位置:1)在属性定义的上面,无需set方法, 推荐使用
* 2)在set方法的上面
*
* 如果要使用byName方式,需要做的是:
* 1.在属性上面加入@Autowired
* 2.在属性上面加入@Qualifier(value="bean的id") :表示使用指定名称的bean完成赋值。
*/
//byName自动注入
@Autowired
@Qualifier("mySchool")
private School school;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
@Value("30")
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
", school=" + school +
'}';
}
}
School.java
package com.bjpowernode.ba04;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("mySchool")
public class School {
@Value("人民大学")
private String name;
@Value("北京的海淀区")
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + ''' +
", address='" + address + ''' +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba04.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest04 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
ba05:
Student.java
package com.bjpowernode.ba05;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
private Integer age;
/**
* 引用类型
* @Autowired: spring框架提供的注解,实现引用类型的赋值。
* spring中通过注解给引用类型赋值,使用的是自动注入原理 ,支持byName, byType
* @Autowired:默认使用的是byType自动注入。
*
* 属性:required ,是一个boolean类型的,默认true
* required=true:表示引用类型赋值失败,程序报错,并终止执行。
* required=false:引用类型如果赋值失败, 程序正常执行,引用类型是null
*
* 位置:1)在属性定义的上面,无需set方法, 推荐使用
* 2)在set方法的上面
*
* 如果要使用byName方式,需要做的是:
* 1.在属性上面加入@Autowired
* 2.在属性上面加入@Qualifier(value="bean的id") :表示使用指定名称的bean完成赋值。
*/
//byName自动注入
@Autowired(required = false)
@Qualifier("mySchool-1")
private School school;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
@Value("30")
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
", school=" + school +
'}';
}
}
School.java
package com.bjpowernode.ba05;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("mySchool")
public class School {
@Value("人民大学")
private String name;
@Value("北京的海淀区")
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + ''' +
", address='" + address + ''' +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba05.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest05 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
ba06:
Student.java
package com.bjpowernode.ba06;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
private Integer age;
/**
* 引用类型
* @Resource: 来自jdk中的注解,spring框架提供了对这个注解的功能支持,可以使用它给引用类型赋值
* 使用的也是自动注入原理,支持byName, byType .默认是byName
* 位置: 1.在属性定义的上面,无需set方法,推荐使用。
* 2.在set方法的上面
*/
//默认是byName: 先使用byName自动注入,如果byName赋值失败,再使用byType
@Resource
private School school;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
@Value("30")
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
", school=" + school +
'}';
}
}
School.java
package com.bjpowernode.ba06;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("mySchool")
public class School {
@Value("航空航天大学")
private String name;
@Value("北京的海淀区")
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + ''' +
", address='" + address + ''' +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba06.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest06 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
ba07:
Student.java
package com.bjpowernode.ba07;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component("myStudent")
public class Student {
@Value("李四" )
private String name;
private Integer age;
/**
* 引用类型
* @Resource: 来自jdk中的注解,spring框架提供了对这个注解的功能支持,可以使用它给引用类型赋值
* 使用的也是自动注入原理,支持byName, byType .默认是byName
* 位置: 1.在属性定义的上面,无需set方法,推荐使用。
* 2.在set方法的上面
*
* @Resource只使用byName方式,需要增加一个属性 name
* name的值是bean的id(名称)
*/
//只使用byName
@Resource(name = "mySchool")
private School school;
public Student() {
System.out.println("==student无参数构造方法===");
}
public void setName(String name) {
this.name = name;
}
@Value("30")
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
", school=" + school +
'}';
}
}
School.java
package com.bjpowernode.ba07;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("mySchool")
public class School {
@Value("航空航天大学")
private String name;
@Value("北京的海淀区")
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + ''' +
", address='" + address + ''' +
'}';
}
}
测试类
package com.bjpowernode;
import com.bjpowernode.ba07.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest07 {
@Test
public void test01(){
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
}
}
输出结果
结论:
/**
* @Component: 创建对象的, 等同于<bean>的功能
* 属性:value 就是对象的名称,也就是bean的id值,
* value的值是唯一的,创建的对象在整个spring容器中就一个
* 位置:在类的上面
*
* @Component(value = "myStudent")等同于
* <bean id="myStudent" class="com.bjpowernode.ba01.Student" />
*
* spring中和@Component功能一致,创建对象的注解还有:
* 1.@Repository(用在持久层类的上面) : 放在dao的实现类上面,
* 表示创建dao对象,dao对象是能访问数据库的。
* 2.@Service(用在业务层类的上面):放在service的实现类上面,
* 创建service对象,service对象是做业务处理,可以有事务等功能的。
* 3.@Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象的,
* 控制器对象,能够接受用户提交的参数,显示请求的处理结果。
* 以上三个注解的使用语法和@Component一样的。 都能创建对象,但是这三个注解还有额外的功能。
* @Repository,@Service,@Controller是给项目的对象分层的。
*
*
*/
/**
* 引用类型
* @Autowired: spring框架提供的注解,实现引用类型的赋值。
* spring中通过注解给引用类型赋值,使用的是自动注入原理 ,支持byName, byType
* @Autowired:默认使用的是byType自动注入。
*
* 属性:required ,是一个boolean类型的,默认true
* required=true:表示引用类型赋值失败,程序报错,并终止执行。
* required=false:引用类型如果赋值失败, 程序正常执行,引用类型是null
*
* 位置:1)在属性定义的上面,无需set方法, 推荐使用
* 2)在set方法的上面
*
* 如果要使用byName方式,需要做的是:
* 1.在属性上面加入@Autowired
* 2.在属性上面加入@Qualifier(value="bean的id") :表示使用指定名称的bean完成赋值。
*/
/**
* 引用类型
* @Resource: 来自jdk中的注解,spring框架提供了对这个注解的功能支持,可以使用它给引用类型赋值
* 使用的也是自动注入原理,支持byName, byType .默认是byName
* 位置: 1.在属性定义的上面,无需set方法,推荐使用。
* 2.在set方法的上面
*
* @Resource只使用byName方式,需要增加一个属性 name
* name的值是bean的id(名称)
*/
最后
以上就是友好御姐为你收集整理的Spring学习笔记03-依赖注入(anno)的全部内容,希望文章能够帮你解决Spring学习笔记03-依赖注入(anno)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复