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

属性注入

@Value

  • 设置普通的属性值

Spring-IOC注解详解

/**
* @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 + '\'' +
'}';
}
}

Spring-IOC注解详解

测试类代码如下:

/**
* @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;

...
}

Spring-IOC注解详解

  • 测试类代码​​同上​

@Resource

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

Spring-IOC注解详解

  • 给​​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 的创建方式
  • 是单例还是多例的方式等等 …

 

Spring-IOC注解详解

  • 修改​​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/>
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   46   0   0 JSpspring
  TEZNKK3IfmPf   19天前   31   0   0 ajaxxml
TEZNKK3IfmPf