一、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配置文件;
不经常改动代码,使用注解;
分享到这里,感谢观看,支持,请点赞!