详解Spring IOC的使用
创始人
2025-06-01 08:02:32
0

目录

1.环境搭建

2.注入方式

2.1.配置文件

2.1.1.Set注入

2.1.2.构造器注入

2.2.注解注入

3.获取方式

4.Bean关系

5.Bean生命周期

6.Bean作用域


1.环境搭建

maven依赖:

org.springframeworkspring-webmvc5.2.0.RELEASE

在resources文件夹下创建xml文件:

......

项目结构:

 

2.注入方式

2.1.配置文件

2.1.1.Set注入

在xml中使用property标签,调用set方法进行注入。

实体类:

使用set方法注入,实体类中必须存在set方法,否则会注入失败。

package com.eryi.beans;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

xml文件:


测试:

public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");User user=applicationContext.getBean("user",User.class);System.out.println(user.toString());}

2.1.2.构造器注入

在xml文件中使用constructor-arg标签,调用构造器进行注入。

实体类:

使用构造器注入,实体类中必须存在构造器,否则会注入失败。

package com.eryi.beans;public class User {private String username;private String password;public User(String username, String password) {this.username = username;this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

xml:


测试:

public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");User user=applicationContext.getBean("user",User.class);System.out.println(user.toString());}

2.2.注解注入

Spring支持通过注解的方式将注入实体注入IOC,然后通过注解去IOC中获取实体。

注入IOC的注解有:

@Component、@Repository、@Service、@Controller

@Component是通用的,后面三个只是为了细化层次为各个分层上的实体推出的,功能上来说都具有将实体注入IOC的能力。

从IOC中获取实体的注解有:

@Autowired

代码示例:

dao层:

package com.eryi.beans;import org.springframework.stereotype.Component;@Component
public class UserDao {public String findAll(){return "find all users";}
}

service:

@Component
public class UserService {private UserDao userDao;@Autowiredpublic UserService(UserDao userDao) {this.userDao = userDao;}public String findAll(){return  userDao.findAll();}
}

测试:

package com.eryi.beans;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test {public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService=applicationContext.getBean("userService",UserService.class);System.out.println(userService.findAll());}
}

3.获取方式

有两种获取方式:

  • 通过id
  • 通过类型

通过id:

UserService userService=applicationContext.getBean("userService",UserService.class);

通过类型:

UserService userService=applicationContext.getBean(UserService.class);

4.Bean关系

在Spring框架中,配置文件除了可以描述类以外,还可以描述Bean的依赖关系。

继承关系:




抽象:

标签中的“abstract”属性用于指定当前Bean是否为抽象Bean,其取值为“true”或“false”,默认为“false”。当一个Bean被指定为抽象Bean时,它不能被直接实例化,而只能作为其他Bean的父类或者模板。这个抽象Bean只是一个模板,其中可以定义一些通用的属性或方法,供其他Bean继承或者引用。

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");User user_01=applicationContext.getBean("childBean",User.class);
System.out.println(user_01);User user_02=applicationContext.getBean("parentBean",User.class);
System.out.println(user_02);

5.Bean生命周期

一个bean在完整生命周期中会触发的方法顺序:

  • 构造器

  • 注入属性(set、构造、或者命名空间)

  • init-method方法

  • 生成实例对象

  • destroy-method(容器关闭触发该方法)

注意:init-method、destroy-method需要配置才会生效。

配置:


实体类:

public class User {private String username;private String password;public User() {System.out.println("construction......");}public String getUsername() {return username;}public void setUsername(String username) {System.out.println("set......");this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}private void init(){System.out.println("init......");}private void destroy(){System.out.println("destroy......");}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

测试:

ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=context.getBean("user",User.class);
context.close();

6.Bean作用域

四种作用域:

  • singleton,默认的,在IOC初始化时创建容器中的实例,全局访问的是同一个实例。

  • prototype,IOC初始化时不生成实例,每次请求生成一个实例。

  • session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

  • request 该属性仅对HTTP请求产生作用,每次HTTP请求都会创建一个新的实例

  • global-session 所有的Session共享一个Bean实例。

相关内容

热门资讯

现场视频!东部战区,最新发布 今天(12月29日),中国人民解放军东部战区位台岛以东海空域,组织驱护舰、歼轰机等兵力,开展对海突击...
市值突破200亿,紧固件龙头超... 文 | 董武英今年以来,除了人工智能这个席卷全球的热点概念之外,商业航天也成为了资本市场最受关注的领...
林斌宣布20亿美元小米减持计划... 2025.12.29本文字数:1006,阅读时长大约2分钟作者 |第一财经 李隽小米集团(01810...
100-150亿搞研发!广州最... 这是什么神仙阵容?!钟南山、饶子和、魏于全、马骏、张亚平、曾木圣、朱健康、周大旺...这么多院士和全...
26岁女子驾车落水身亡,湖北警... 湖北省天门市公安局2025年12月28日通报: 12月27日上午7时许,我市接官路发生一起车辆落水事...
冯仑:想得美、说得好、干得欢、... 封面图 | 《前途无量》剧照01问:冯叔,我是一名90后创业者,团队里也以90后居多。我看到一个说法...
请查收!慢牛到存款搬家,202... 图/IC2025年尾,又到了一年回顾与思考的时刻。这一年,资本市场在稳步前行中实现了关键突破。上证指...
东风汽车财务违规被罚48.3万... 近日,中国人民银行湖北省分行公布的鄂银罚决字〔2025〕28号行政处罚决定,揭露了东风汽车财务有限公...
回顾充满活力2025年 我们回顾一下充满激情和活力的2025年。2025年的大事件要数上证指数一度站上4000点,中国资本市...
“蚂蚁阿福”声明:健康问答结果... 12月29日,针对问答结果中是否会有商业广告的猜测,AI健康应用“蚂蚁阿福”发布官方声明明确表示,阿...