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)获取上下文
结果:
@Configuration注解的类必需使用<context:component-scanbase-package=”XXX”/>扫描
@Configuration的具体用法参考:https://www.cnblogs.com/duanxz/p/7493276.html.