Spring IOC 使用

IOC 的原理是通过依赖注入(Dependency Injection,DI)实现的。依赖注入是指将对象的依赖关系从代码中移动到外部容器中,并通过容器将依赖注入到对象中。原文 Spring IOC 使用

2.1 IOC 使用示例

示例:假设我们有一个简单的应用程序,其中包含两个类:UserService 和 UserRepository。UserService 需要依赖 UserRepository 来执行数据库操作。

第一步:定义接口和实现类:

public interface UserRepository {
    void save(User user);
}

public class UserRepositoryImpl implements UserRepository {
    public void save(User user) {
        // 实现保存用户到数据库的逻辑
    }
}

public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }
}

第二步:使用 Spring IOC 容器进行依赖注入:
在 Spring 中,我们可以通过 XML 配置或注解来定义对象之间的依赖关系。

XML 配置示例:

<bean id="userRepository" class="com.example.UserRepositoryImpl" />

<bean id="userService" class="com.example.UserService">
    <constructor-arg ref="userRepository" />
</bean>

注解配置示例:

@Repository
public class UserRepositoryImpl implements UserRepository {
    // 实现代码
}

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 方法代码
}

第三步:使用 IOC 容器获取 UserService 实例:

public class MyApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean("userService", UserService.class);
        // 使用userService进行操作
    }
}

在上面的示例中,我们通过 Spring IOC 容器实现了对 UserService 和 UserRepository 的依赖注入。在应用程序启动时,IOC 容器会负责创建 UserService 和 UserRepository 的实例,并将 UserRepository 的实例注入到 UserService 中??⒄呶扌枋侄道韵蠡蚬芾矶韵笾涞囊览倒叵?,从而实现了控制反转和解耦。

2.2 IOC 容器中 JavaBean 的配置方式

在 Spring IOC 容器中,可以使用不同的配置方式来定义和配置 JavaBean。以下是几种常用的配置方式:

方式一:XML 配置方式:使用 XML 文件来配置 JavaBean??梢酝ü?lt;bean>元素来定义和配置 JavaBean 的属性、依赖关系等。示例:

<bean id="userService" class="com.example.UserService">
    <property name="userRepository" ref="userRepository" />
</bean>

<bean id="userRepository" class="com.example.UserRepositoryImpl" />

方式二:注解配置方式:使用注解来标识 JavaBean,并由容器自动进行扫描和注册。可以使用注解如@Component、@Service、@Repository、@Controller 等来标识 JavaBean,并使用@Autowired、@Resource 等注解来注入依赖。示例:

@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

@Component
public class UserRepositoryImpl implements UserRepository {
    // 实现代码
}

方式三:Java 配置方式:使用 Java 类来配置 JavaBean??梢酝ü?Java 类中的特定方法来定义和配置 JavaBean,并使用 Spring 提供的注解如@Configuration、@Bean 等来标识和配置 JavaBean。示例:

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        UserService userService = new UserService();
        userService.setUserRepository(userRepository());
        return userService;
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
}

需要注意的是,以上的配置方式可以单独使用,也可以组合使用。例如,在 XML 配置中可以引用注解配置的 JavaBean,或在 Java 配置中引用 XML 配置的 JavaBean。

无论使用哪种配置方式,Spring IOC 容器都会根据配置信息来实例化 JavaBean,并管理它们的生命周期和依赖关系。

2.3 依赖注入方式

方式一:构造函数注入(Constructor Injection):通过构造函数来注入依赖。在对象实例化时,容器会调用带有依赖参数的构造函数来创建对象,并将依赖对象作为参数传递进去。
示例:

public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

方式二:属性注入(Setter Injection):通过属性的 Setter 方法来注入依赖。容器在对象实例化后,通过调用对象的 Setter 方法来设置依赖对象。
示例:

public class UserService {
    private UserRepository userRepository;

    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

方式三:接口注入(Interface Injection):通过特定的接口方法来注入依赖。通常使用 Java 提供的 InitializingBean 接口或 Spring 提供的@PostConstruct 注解来定义初始化方法,在该方法中进行依赖注入。
示例:

public class UserService implements InitializingBean {
    private UserRepository userRepository;

    public void afterPropertiesSet() throws Exception {
        // 在该方法中进行依赖注入
    }
}

方式四:注解注入(Annotation Injection):通过使用注解来标记依赖关系,并由容器自动完成注入。Spring 提供了多个注解,如@Autowired、@Inject、@Resource 等,用于标识依赖关系。
示例:

public class UserService {
    @Autowired
    private UserRepository userRepository;
}

需要注意的是,以上的依赖注入方式可以单独使用,也可以组合使用,根据具体的场景和需求选择适合的方式。此外,Spring IOC 容器还支持通过配置文件(如 XML 配置)来进行依赖注入。在配置文件中,可以通过<property>元素来设置属性的值,或使用<constructor-arg>元素来设置构造函数参数的值。

3. 无侵入容器

在设计上,Spring 的 IoC 容器是一个高度可扩展的无侵入容器。所谓无侵入,是指应用程序的组件无需实现 Spring 的特定接口,或者说,组件根本不知道自己在 Spring 的容器中运行。这种无侵入的设计有以下好处:

解耦:IOC 容器负责管理对象的创建和依赖注入,将对象之间的关系从代码中解耦。开发者只需声明对象的依赖关系,而不需要手动实例化对象或管理对象之间的依赖关系,从而降低了代码的耦合度。

可测试性:IOC 使得应用程序中的对象更易于测试。由于对象的依赖关系由 IOC 容器管理,开发者可以通过模拟依赖对象来进行单元测试,而无需关注对象的实例化和依赖注入。

可维护性:通过使用 IOC 容器,应用程序的配置信息集中在一个地方,易于维护和修改??⒄呖梢酝ü虻サ呐渲梦募蜃⒔饫垂芾矶韵蟮囊览倒叵?,而无需修改源代码。

灵活性:IOC 容器使得应用程序更加灵活,可以在运行时动态地替换对象的实现或配置??⒄呖梢酝ü呐渲眯畔?,实现不同的对象组合或切换不同的实现,而无需修改代码。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容