Spring框架中bean管理的常用注解

 一、Spring 中用于管理bean的注解分为四大类:

  •    用于创建对象
  •    用于给对象中的属性注入值
  •    用于改变作用范围
  •     用于定义生命周期

1.用于创建对象

    @Component  @Controller  @Service  @Repository

   ① @Componet /  @Componet(value="")注解:

        作用:把资源让 spring 来管理,相当于在 xml 中配置一个 bean。

        属性:value 指定 bean 的 id 。如果不指定 value 属性,默认为 bean 的 id 是当前类 类名,首字母小写

 

   ② @Controller  @Service @Repository

        它们三个注解都是针对一个的衍生注解,它们的作用及属性都是一模一样的。

        它们不同的地方在于各自提供了明确的语义化:

         @Controller : 一般用于表现层的注解。

         @Service :一般用于业务层的注解。

         @Repository :一般用于持久层的注解

 2.用于注入数据

@Value  @Autowired  @Qualifier  @Resource

相当于 

   ①  @Value

        作用:注入基本数据类型和 String 类型数据的

        属性:用于指定值

@Value("张三")
private String name;

   ② @Autowired

        作用: 自动按照类型注入,当使用注解注入属性时,set方法可以省略,它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器中查找,找到了也可以注入成功。找不到就报错。

   ③  @Qualifier

        作用: 在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。 它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。

        属性:value  指定bean的id

public interface UserService {
    public User getUserById(integer id);
}


@Service("userServiceImpl")
public class UserServiceImpl implements UserService {
    public User getUserById(integer id) {
        return new User();
    }
}

@Service("userServiceImpl1")
public class UserServiceImpl1 implements UserService {
    public User getUserById(integer id) {
        return new User();
    }
}


@Controller
@RequestMapping("/user")
public class UserInfoControl {
    
    @Autowired
    @Qualifier("userServiceImpl1")
    UserService userService;
    
    @RequestMapping("/showUserInfo")
    public void showUserInfo(HttpServletRequest request, HttpServletResponse response, User user) {
        //..........
    }
}

     ④ @Resource

        作用:直接按照 Bean 的 id 注入。它也只能注入其他Bean类型。

        属性:name  指定 bean 的值

 3.用于改变作用域范围的

     ①  @Scope

          作用:指定bean的作用范围

          属性:指定范围的值,取值:singleton prototype request session globalsession

          在该类上加 @Scope 注解,指定该类是多例的,默认是单例的。给该类显示指定一个无参构造方法,方便测试

4.和生命周期相关的

     相当于:

     ① @PostConstruct注解

        @PostConstruct 加在方法上,指定bean对象创建好之后,调用该方法初始化对象,类似于 xml 的 init-method 方法。修改UserServiceImpl类,在其中增加一个init方法,在该方法上指定 @PostConstruct注解

public class UserServiceImpl implements UserService(){
    @Autowired
    private UserDao userDao;

    @PostConstruct
    public void init(){
        System.out.println("调用了init方法......");
    }

    @Override
    public void saveUser(){
        System.out.println("业务层:用户保存...." + name);
        userDao.save();
    }
}

    ② @PreDestory 注解

         @PreDestory 加在方法上,指定bean销毁之前,调用该方法,类似于xml的 destory-method 方法。修改UserServiceImpl类,在该类中增加一个destroy方法,在该方法上加 @PreDestroy注解

public class UserServiceImpl implements UserService(){
    @Autowired
    private UserDao userDao;

    @PostConstruct
    public void init(){
        System.out.println("调用了init方法......");
    }

    @Override
    public void saveUser(){
        System.out.println("业务层:用户保存...." + name);
        userDao.save();
    }

    @PreDestory
    public void destory(){
        System.out.println("调用了destory方法......");
    }
}

注意:要看到 @PreDestory 的效果,需要调用 ClassPathXmlApplicationContext.close方法,同时 scope的值要是 singleton。所以,还得修改以下代码,显示关闭 ioc 容器

@Test
public void test(){
    //创建ioc容器
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService1 = (UserService) ac.getBean("userService");
    UserService userService2 = (UserService) ac.getBean("userService");
    System.out.println(userService1 == userService2);
    ((ClassPathXmlApplicationContext)ac).close();
}

5.新注解说明

① @Configuration

     作用:用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。

     属性:value:用于指定配置类的字节码

② @ComponentScan

    作用:用于指定spring在初始化容器时要扫描的包。

               作用和在spring的xml配置文件中的:  是一样的。

    属性:basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。

 ③ @Bean

     作用:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。

     属性:name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)

  ④ @PropertySource

      作用:用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。

      属性:value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath。

  ⑤ @Import 

       作用: 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。

       属性:value[]:用于指定其他配置类的字节码。

  ⑥ @ContextConfiguration

       @ContextConfiguration 注解可以通过 classes 属性指定加载哪个配置类

      

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = "指定加载哪个配置类")
public class Test {

    @Autowired
    private UserService userService;

    @Test
    public void test1(){
        ..........
    }

}

 常用注解小结:

与创建 bean 对象相关:

@Component @Controller @Service @Repository

与注入值相关:

@Value @Autowired(重点) @Qualifier @Resource

与范围相关:

@Scope

与生命周期相关:

@PostConstruct @PreDestroy

 

你可能感兴趣的:(Spring)