B站学习框架技术:Spring 基于注解的DI{@Component,@Repository,@Service,@Controller,@Value,@Autowired,@Resource}

一、Spring配置文件添加组件扫描器
如果需要使用DI注解,首先需要在Spring配置文件(通常为applicationContext.xml)中配置组件扫描器,用于扫描注解,所以一定记得在配置文件中指定注解所在的包名,最重要!!!所以一定记得在配置文件中指定注解所在的包名,最重要!!!所以一定记得在配置文件中指定注解所在的包名,最重要!!!配置文件内容如下:
在这里插入图片描述
配置文件中指定注解所在包名的三种方式:
(1)使用多个context:component-scan指定不同的包名

<context:component-scan base-package="com.bjpowernode.beans"/>
<context:component-scan base-package="com.bjpowernode.vo"/>

(2)base-package的值使用“,”或“;”隔开:

逗号分隔:
<context:component-scan base-package="com.bjpowernode.beans,com.bjpowernode.vo"/>
分号分隔:
<context:component-scan base-package="com.bjpowernode.beans;com.bjpowernode.vo"/>

(3)将base-package指定到父包名

<context:component-scan base-package="com.bjpowernode">
*以下不建议使用,会造成容器启动缓慢*
<context:component-scan base-package="com">	

二、用于创建对象{定义Bean}的四个注解
@Component;
@Repository;
@Service;
@Controller;

1、@Component

@Component:用于指定bean的id值,用法如下:
@Component(value="myStudent")
/*
等同于:
	<bean id="myStudent" class="com.bjpowernode.ba01.Student"/>
*/
public class Student{
	private String name;
	private int age;
}
其中"value="可以省略,如下:
@Component("myStudent")
public class Student{
	private String name;
	private int age;
}
如果@Component不指定vaue属性,那么默认value为当前类名的首字母小写,如下:
@Component
//此时@Component 等同于 @Component("student")
public class Student{
	private String name;
	private int age;
}

2、@Repository;@Service;@Controller
首先需要说明:这三个注解和上边的@Component都是可以创建对象的,且使用的方法与上边@Component一样,但细细分析,这三个的功能与@Component稍有不同:

	@Repository:用于创建持久层对象
		{也就是访问数据库的对象-------数据库的连接和增删改查}
	@Service:用于创建业务层对象
		{主要是做事务处理,也就是引用对应dao层的数据库操作}
	@Controller:用于创建控制层对象
		{主要是引用Service层的对象,例如Tomcat服务器创建的对象,能够接收用户提交的参数,显示用户请求和处理请求结果。}

三、简单类型属性注入@Value
使用该注解对属性进行赋值时,类中可以没有setter方法,用法如下:

@Component("mystudent")
public class Student {
	@Value(value="张三")
	private String name;
	@Value("21")
	//@Value("21")等同于@Value(value="21")
	private int age;
}

四、引用类型自动注入@Autowired和@Resource

1、@Autowired的自动注入:默认使用按类型自动注入,该注入类中可以没有setter方法:

byType按类型自动注入:
首先创建一个引用的类:School
@Component
public class School{
	@Value("清华大学")
	private String name;
}
再创建一个引用School的类:Student
@Component("myStudent")
public class Student{
	@Value("张三")
	private String name;
	@Value("21")
	private int age;
	@Autowired
	private School school;
}
byName按属性名称自动注入
此时需要和另一个注解@Qualifier一起使用:
{@Qualifier的value值为引用对象名}
//创建被引用类
@Component("mySchool")
public class School{
	@value("清华大学")
	private String name;
}
//创建引用类School的类
@Component("myStudent")
public class Student{
	@Value("张三")
	private String name;
	@Value("21")
	private int age;
	@Autowired
	@Quelifier("mySchool")
	/*这两个注解没有先后顺序哦!
		@Quelifier("mySchool")
		@Autowired
	*/
	private School school;
}
	@Autowired补充:
	@Autowired还有一个属性required,默认值为true,表示当匹配失败后,会终止程序运行并报错;
	如果required的值为false,则匹配失败时,会将未匹配的属性值设为null,如下:
//创建被引用类
@Component("school")
public class School{
	@value("清华大学")
	private String name;
}
//创建引用类School的类
@Component("myStudent")
public class Student{
	@Value("张三")
	private String name;
	@Value("21")
	private int age;
	@Autowired(required=false)
	@Qulifier("mySchool")
	private School school;

在这里插入图片描述
五、JDK注解@Resource自动注入
Spring 提供了对jdk中@Resource注解的支持{要求JDK版本必须是6及以上的版本!!!}。此注解既可以按名称匹配Bean也可以按类型匹配Bean。默认是按名称匹配,该注入类中也可以不写setter方法:

byName默认自动注入
@Component("mySchool")
public class School{
	@Value("清华大学")
	private String name;
}

@Component("myStudent")
public class Student{
	@Value("张三")
	private String name;
	@Value("21")
	private int age;
	@Resource(name="mySchool")
	private School school;
}
如果@Resource注解不带任何参数,则采用按名称的方式注入,按名称方式不能注入Bean,则会按照类型进行Bean的匹配注入。
@Component("mySchool")
public class School{
	@Value("清华大学")
	private String name;
}

@Component("myStudent")
public class Student{
	@Value("张三")
	private String name;
	@Value("21")
	private int age;
	@Resource
	private School school;
}

注解和xml配置文件使用的场景:

经常改动代码,使用xml配置文件;
不经常改动代码,使用注解;

分享到这里,感谢观看,支持,请点赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大脑经常闹风暴@小猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值