什么是注解

注解可认为 一种特殊的注释
注释只能停留在源代码中
而注解可以在编译时甚至运行时起作用

元注解

@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;
    }



}

注入属性

注解注入属性

  1. @Autowired//这个根据属性类型自动注入
  2. @Qulifier//这个根据属性名注入
  3. @Resource//这个可选从类型注入还是名称注入
  4. @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 类