Spring学习笔记(五)——Spring中常用的注解

Spring中常用的注解:

  • @Autowired :进行自动装配,先通过byType进行自动装配,再通过byName进行自动装配,
    @Autowired(required = false)允许这个bean属性在xml文件不存在(没有在xml文件中配置),默认required=true
  • @Qualifier :搭配@Autowired使用,@Qualifier(value = id) 查找指定id的bean进行自动装配
  • @Resource :进行自动装配,先通过byName进行自动装配,再通过byType进行自动装配,@Resource(name = id) 指定查找指定id的bean装配
  • @Primary :自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

上面几个注解可以看我上一篇关于自动装配的博客,有详细讲解用法,下面我举例说明下 @Primary

定义一个接口:

@Repository
public interface UserDao {
     
    public void say();
}

定义两个对应的实现类:

@Repository()
public class User1 implements UserDao{
     
    public void say() {
     
        System.out.println("User1学Python");
    }
}
@Repository
@Primary
public class User2 implements UserDao{
     
    public void say() {
     
        System.out.println("User2学Java");
    }
}

定义一个UserService:

@Service
public class UserService {
     
    @Autowired
    private UserDao userDao;

    public UserDao getUserDao() {
     
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
     
        this.userDao = userDao;
    }
}

测试:

public static void main(String[] args) {
     
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService user = context.getBean("userService", UserService.class);
        user.getUserDao().say();
    }

输出:
在这里插入图片描述
上面的User2使用了@Primary,所以当自动装配时当出现多个Bean候选者时,被作为首选者。

  • @Component :组件,放在类上,说明这个类被Spring管理了,是所有受Spring管理组件的通用形式
  • @Value :为属性显示的赋值
@Component // 等价:<bean id="user" class="pojo.User"></bean>
public class User {
     
    @Value("周杰伦") // 等价:<property name="name" value="周杰伦"></property>
    private String name;
}
  • @Repository : 功能与@Component相同,但一般用于项目持久层(Dao层)
  • @Service :功能与@Component相同,但一般用于项目业务层(Service层)
  • @Controller : 功能与@Component相同,但一般用于项目控制层(如servlet控制层)
  • @Nullable :标记一个字段,说明允许这个字段的值可以为null
public void setName(@Nullable String name) {
      // 允许参数name为null
    this.name = name;
}

@Component、@Repository、@Service、@Controller 注解一个bean后,默认这个bean的id为这个类的类名首字母小写(如User它的id为user),但是可以通过@Component(value = “user2”)这种方式自定义它的id,其他三个注解也一样。

  • @Scope() :作用域,默认为单例模式,@Scope(“prototype”)设为原型模式

生命周期:Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作

  • @PostConstruct :作用在void方法上,在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次

  • @PreDestroy :作用在void方法上,注解的方法在destroy()方法调用后得到执行

  • @Lazy(true) :默认为true,用于指定该Bean是否取消预初始化,用于注解类,延迟初始化

  • @Configuration :该类等价与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。

创建一个Config类:

// 被@Configuration注解后,这个Config类会被Spring容器托管,注册到容器中,因为@Configuration底层就是被@Component实现
@Configuration // 该类等价与XML中配置beans,相当于Ioc容器
public class Config {
     
    public Config() {
     
        System.out.println("Config初始化");
    }

    // 被@Bean注解后,这个方法的名字就相当于bean标签中的id,返回值类型就相当于bean标签中的class
    @Bean // 与xml中配置的bean意思一样
    public Teacher getTeacher(){
     
        return new Teacher();
    }
}

创建一个Teacher类:

public class Teacher {
     
    @Value("张三")
    private String name;

    public Teacher() {
     
        System.out.println("Teacher初始化");
    }

    public String getName() {
     
        return name;
    }

    public void setName(String name) {
     
        this.name = name;
    }
}

测试:

public static void main(String[] args) {
     
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Teacher teacher = (Teacher)context.getBean("getTeacher");
        System.out.println(teacher.getName());
    }

此时必须使用AnnotationConfigApplicationContext(Config.class)获取上下文

结果:
Spring学习笔记(五)——Spring中常用的注解_第1张图片
@Configuration注解的类必需使用扫描
@Configuration的具体用法参考:https://www.cnblogs.com/duanxz/p/7493276.html.

你可能感兴趣的:(Spring学习,SSM框架学习)