Spring-IOC注解详解

@Component

  • 标记一个类,将这个类交给 Spring 管理
  • 相当于在配置文件当中配置的 <bean id="" class="">
  • @Component的三个衍生注解
    • @Controller:web层
    • @Service:service层
    • @Repository:dao层
  • 为了更好的进行 分层,可以使用 Spring 其它三个注解,功能都是类似的
  • 目前使用哪一个注解功能都一样, 后期可能会在每一个注解中添加一些属于各自的属性

属性注入

@Value

  • 设置普通的属性值

/**
 * @author: BNTang
 **/
@Component("user")
public class User {
    @Value("BNTang")
    private String name;

    public void say() {
        System.out.println("name = " + name);
    }
}

@Autowired

  • 设置 对象类型 的属性值
  • 直接使用这个注解,是按照 类型 完成的属性注入
  • 不需要在注解上指定 id名称
  • 修改 User 类,修改之后代码如下:
/**
 * @author: BNTang
 **/
@Component("user")
public class User {
    @Autowired
    private Dog dog;

    @Override
    public String toString() {
        return "User{" +
                "dog=" + dog +
                '}';
    }
}
  • Dog 类代码如下:
/**
 * @author: BNTang
 **/
@Component("dog")
public class Dog {

    @Value("旺财")
    private String name;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

  • 测试类代码如下:
/**
 * @author: BNTang
 **/
public class UserDaoTest {
    @Test
    public void Demo() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("user");

        System.out.println(user);
    }
}
  • 如果习惯是按照名称来完成属性注入的,意思是说指定 id的名称 来进行属性注入
  • @Autowired 注解必须与 @Qualifier 一起使用才可以
  • 修改 User 类,修改之后代码如下:
/**
 * @author: BNTang
 **/
@Component("user")
public class User {
    @Autowired
    @Qualifier("dog")
    private Dog dog;

    ...
}

  • 测试类代码 同上

@Resource

  • 这个注解也是设置 对象类型 的属性值
  • 是按照 name 来进行属性注入的
  • 如果你使用上面的两个注解联合,你其实可以使用当前这个注解来进行注入
  • 一个注解代替两个,需要 JDK8
/**
 * @author: BNTang
 **/
@Controller("user")
public class User {
    @Resource(name = "dog")
    private Dog dog;
}

  • User 类添加一个 toString 即可看到 Dog 类的 name 值
  • 测试类代码同上

@PostConstruct

  • 可以使用该注解,来指定对象在初始化的时候执行的方法
  • 修改 User 类,修改之后代码如下:
/**
 * @author: BNTang
 **/
@Component("user")
public class User {
    @PostConstruct
    public void init(){
        System.out.println("init bean success");
    }
}
  • 测试类代码不变运行即可看到效果:
/**
 * @author: BNTang
 **/
public class UserDaoTest {
    @Test
    public void Demo() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("user");
    }
}

@PreDestroy

  • 在对象被销毁的时候,指定需要执行的方法
  • 也就是在对象销毁之前需要执行什么东西,做什么事情
  • 修改 User 类,代码如下:
/**
 * @author: BNTang
 **/
@Component("user")
public class User {
    @PreDestroy
    public void destroy(){
        System.out.println("bean destroy success");
    }
}
  • 测试类代码如下
  • 至于为什么是下面的方式进行测试我前面已经讲解过了不懂的回去看看即可
/**
 * @author: BNTang
 **/
public class UserDaoTest {
    @Test
    public void Demo() {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("user");

        applicationContext.close();
    }
}

@scope

  • 指定 Bean 的作用范围
  • 其实是用来指定 Bean 的创建方式
  • 是单例还是多例的方式等等 …

  • 修改 User 类代码如下:
/**
 * @author: BNTang
 **/
@Component("user")
@Scope("singleton")
public class User {
}
  • 测试类代码如下:
/**
 * @author: BNTang
 **/
public class UserDaoTest {
    @Test
    public void Demo() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("user");
        User userTwo = (User) applicationContext.getBean("user");

        System.out.println(user);
        System.out.println(userTwo);
    }
}
  • 输出结果如下:
top.it6666.domain.User@16e7dcfd
top.it6666.domain.User@16e7dcfd
  • 再次修改 User 类代码如下:
/**
 * @author: BNTang
 **/
@Component("user")
@Scope("prototype")
public class User {
}
  • 测试类代码同上
  • 输出结果如下:
top.it6666.domain.User@16e7dcfd
top.it6666.domain.User@3d121db3
  • 其实这些注解是简化了我们之前讲解的 xml 形式的配置
  • 作用可以参考之前的文章

XML与注解比较

  • XML 可以适用,任何场景
  • 结构清晰,维护方便
  • 注解不是自己提供的类使用不了,也就是自己创建的类
  • 开发简单方便

XML与注解一起使用

  • XML 管理 Bean
  • 注解完成属性注入
  • 使用过程中,可以不用扫描,扫描是为了让类上的注解生效,也就是扫描 Bean 交给 Spring 进行管理
  • 在没有扫描的情况下,使用 @Resource@Value@Autowired@Qulifier,这些注解
  • 只需要在 XML 中添加一个注解的支持即可
<context:annotation-config/>
posted @ 2020-10-04 14:31  BNTang  阅读(138)  评论(0编辑  收藏  举报