Spring第三篇-Bean管理-注解方式
什么是注解
注解可认为 一种特殊的注释
注释只能停留在源代码中
而注解可以在编译时甚至运行时起作用
元注解
@Target 注解
Target 注解的作用是:描述注解的使用范围(即:被修饰的注解可以用在什么地方) 。
Target 注解用来说明那些被它所注解的注解类可修饰的对象范围:注解可以用于修饰 packages、types(类、接口、枚举、注解类)、类成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch 参数),在定义注解类时使用了@Target 能够更加清晰的知道它能够被用来修饰哪些对象,它的取值范围定义在 ElementType 枚举中。
public enum ElementType {
TYPE, // 类、接口、枚举类
FIELD, // 成员变量(包括:枚举常量)
METHOD, // 成员方法
PARAMETER, // 方法参数
CONSTRUCTOR, // 构造方法
LOCAL_VARIABLE, // 局部变量
ANNOTATION_TYPE, // 注解类
PACKAGE, // 可用于修饰:包
TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
}
@Retention 注解
Reteniton 注解的作用是:描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。
Reteniton 注解用来限定那些被它所注解的注解类在注解到其他类上以后,可被保留到何时,一共有三种策略,定义在 RetentionPolicy 枚举中。
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息
}
@Documented 注解
Documented 注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
@Inherited 注解
Inherited 注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited 修饰的注解,则其子类将自动具有该注解)。
spring 注解方式管理 Bean
spring 注解创建对象
xml 中配置开启组件扫描
<context:component-scan base-package="springDemo" >
<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>-->
</context:component-scan>
组件扫描设置扫描范围
设置扫描范围
通过 context:include 标签设置扫描被那个注解修饰的类
<context:component-scan base-package="springDemo" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
</context:component-scan>
设置不扫描范围
通过 context:exclude 标签设置不扫描被哪个注解修饰的类
context:component-scan base-package="springDemo" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component"/>
</context:component-scan>
导入外部属性文件
<context:property-placeholder location="config.properties"></context:property-placeholder>
类用注解修饰
- @Conmponent
- @Controller web 层
- @Service 业务层
- @Repository 持久层
目前来说,这四个注解的功能是一样的
在开启组件扫描的 package 中新建 class,并在 class 上用以上四种注解之一修饰,即可创建对象。
package springDemo;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Value;
@Service(value = "userInfo1")//这里的value设置的是对象的id,如果不显式设置,默认为首字母小写的类名
@Scope(value = "singleton")//这里设置对象是单例的还是多例的
public class UserInfo {
@Value("${prog.name}")
private String StudentId;
private String UserId;
private String Name;
private String Section;
public String getStudentId() {
return StudentId;
}
public void setStudentId(String studentId) {
StudentId = studentId;
}
public String getUserId() {
return UserId;
}
public void setUserId(String userId) {
UserId = userId;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getSection() {
return Section;
}
public void setSection(String section) {
Section = section;
}
public UserInfo(){
System.out.println("UseriNfo类初始化");
}
public void display(){
System.out.println(Name+"::"+Section+"::"+StudentId+"::"+UserId);
}
public UserInfo(String name,String section,String userid,String StudentId){
this.Name=name;
this.Section=section;
this.UserId=userid;
this.StudentId=StudentId;
}
}
注入属性
注解注入属性
- @Autowired//这个根据属性类型自动注入
- @Qulifier//这个根据属性名注入
- @Resource//这个可选从类型注入还是名称注入
- @Value//用来诸如普通属性
@Autowired
@Qulifier
@Qulifier 注解跟 Autowired 注解配合使用,用对象的名称来注入
@Value
完全注解开发
配置 Configuration 类
package springDemo.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.test.context.ContextConfiguration;
@Configuration//标识此类位配置类
@ComponentScan(basePackages = "springDemo")//配置组件扫描
@PropertySource(value = "classpath:config.properties")//导入外部属性文件
public class SpringConfig {
}
编写启动类
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
用_ AnnotationConfigApplicationContext 类替换_ClassPathXmlApplicationContext 类