java的 import注解_JavaConfig @Import 和 @ImportResource注解的使用

最近在看《Spring in Action 4th》,讲到JavaConfig的@Import和@ImportResource的使用,于是照着例子做了个小demo,加深自己的印象。在Spring中配置有xml和JavaConfig的配置方式,相比来说,使用JavaConfig的方式配置会更利于管理,类型安全。

demo项目结构(Maven约定):

├── pom.xml

└── src

├── main

│ ├── java

│ │ └── com

│ │ └── jiaobuchong

│ │ ├── config

│ │ │ ├── CDConfig.java

│ │ │ ├── CDPlayerConfig.java

│ │ │ └── SoundSystemConfig.java

│ │ ├── dao

│ │ │ └── CompactDisc.java

│ │ └── soundsystem

│ │ ├── BlankDisc.java

│ │ ├── CDPlayer.java

│ │ └── SgtPeppers.java

│ └── resources

│ └── cons-injec.xml

└── test

└── java

└── com

└── jiaobuchong

├── soundsystem

├── CDPlayerTest.java

├── CDPlayerTest1.java

└── CDPlayerTest2.java

config包下的三个配置类

CDConfig.java:

package com.jiaobuchong.config;

import com.jiaobuchong.dao.CompactDisc;

import com.jiaobuchong.soundsystem.SgtPeppers;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CDConfig {

@Bean // 将SgtPeppers注册为 SpringContext中的bean

public CompactDisc compactDisc() {

return new SgtPeppers(); // CompactDisc类型的

}

}

CDPlayerConfig.java:

package com.jiaobuchong.config;

import com.jiaobuchong.dao.CompactDisc;

import com.jiaobuchong.soundsystem.CDPlayer;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Import;

@Configuration

@Import(CDConfig.class) //导入CDConfig的配置

public class CDPlayerConfig {

@Bean(name = "cDPlayer")

public CDPlayer cdPlayer(CompactDisc compactDisc) {

/*这里会注入CompactDisc类型的bean 这里注入的这个bean是CDConfig.class中的CompactDisc类型的那个bean*/

return new CDPlayer(compactDisc);

}

}

SoundSystemConfig.java:

package com.jiaobuchong.config;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Import;

import org.springframework.context.annotation.ImportResource;

@Configuration

@Import(CDPlayerConfig.class)

@ImportResource("classpath:cons-injec.xml") //导入xml配置项

public class SoundSystemConfig {

}

这里使用注解@Bean就好比如xml配置时的:

@ImportResource类似于xml配置时的:

dao包下的一个接口:

CompactDisc.java:

package com.jiaobuchong.dao;

public interface CompactDisc {

void play();

}

soundsystem包下的类:

BlankDisc.java:

package com.jiaobuchong.soundsystem;

import com.jiaobuchong.dao.CompactDisc;

import java.util.List;

public class BlankDisc implements CompactDisc {

private String title;

private String artist;

private List tracks;

public BlankDisc(String title, String artist, List tracks) {

this.title = title;

this.artist = artist;

this.tracks = tracks;

}

public void play() {

System.out.println("Playing " + title + " by " + artist);

for (String track : tracks) {

System.out.println("-Track: " + track);

}

}

}

CDPlayer.java:

package com.jiaobuchong.soundsystem;

import com.jiaobuchong.dao.CompactDisc;

import org.springframework.beans.factory.annotation.Autowired;

public class CDPlayer implements CompactDisc {

private CompactDisc cd;

@Autowired //构造函数注入

public CDPlayer(CompactDisc cd) {

this.cd = cd;

}

public void play() {

cd.play();

}

}

SgtPeppers.java:

package com.jiaobuchong.soundsystem;

import com.jiaobuchong.dao.CompactDisc;

import org.springframework.stereotype.Component;

public class SgtPeppers implements CompactDisc {

private String title = "Sgt. Pepper's Lonely Hearts Club Band";

private String artist = "The Beatles";

public void play() {

System.out.println("Playing " + title + " by " + artist);

}

}

xml配置文件

cons-injec.xml:

Sgt. Pepper's Lonely Hearts Club Band

With a Little Help from My Friends

Lucy in the Sky with Diamonds

Getting Better

Fixing a Hole

测试类

CDPlayerTest.java:

package com.jiaobuchong.soundsystem;

import com.jiaobuchong.config.CDConfig;

import com.jiaobuchong.config.CDPlayerConfig;

import com.jiaobuchong.dao.CompactDisc;

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;

/* CDPlayerTest takes advantage of Spring’s SpringJUnit4ClassRunner to have a Spring application context automatically created when the test starts. And the @Context-Configuration annotation tells it to load its configuration from the CDPlayerConfig class. */

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = CDConfig.class)

public class CDPlayerTest {

@Autowired

private CompactDisc cd;

@Test

public void cdShouldNotBeNull() {

// assertNotNull(cd);

cd.play();

}

}

CDPlayerTest1.java:

package com.jiaobuchong.soundsystem;

import com.jiaobuchong.config.CDConfig;

import com.jiaobuchong.config.CDPlayerConfig;

import com.jiaobuchong.dao.CompactDisc;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = CDPlayerConfig.class)

public class CDPlayerTest1 {

@Autowired

@Qualifier("cDPlayer")

private CompactDisc cd;

@Test

public void cdShouldNotBeNull() {

// assertNotNull(cd);

cd.play();

}

}

CDPlayerTest2.java:

package com.jiaobuchong.soundsystem;

import com.jiaobuchong.config.CDPlayerConfig;

import com.jiaobuchong.config.SoundSystemConfig;

import com.jiaobuchong.dao.CompactDisc;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = SoundSystemConfig.class)

public class CDPlayerTest2 {

@Autowired

@Qualifier("cDPlayer")

private CompactDisc cd;

@Autowired

@Qualifier("compactDisc")

private CompactDisc cd1;

@Test

public void cdShouldNotBeNull() {

// assertNotNull(cd);

cd.play();

}

@Test

public void testBlankDisc() {

cd1.play();

}

}

看完这个demo代码,基本上@Import和ImportResource的意义应该也就明白了,更多细节请参考《Spring in Action 4th》。

@Import注解Java中用于导入其他配置类或组件的注解,它可以用在类级别上,用于导入其他类或组件,从而让它们成为当前类的依赖项。@Import注解支持三种不同的导入方式: 1. 导入配置类: 可以使用@Import注解来导入一个或多个配置类,这些配置类会被Spring容器加载并且进行解析,从而可以在应用程序中使用。例如: ``` @Configuration @Import({Config1.class, Config2.class}) public class AppConfig { // Configuration code... } ``` 在上面的例子中,AppConfig使用@Import注解来导入了Config1和Config2两个配置类。 2. 导入普通的组件: 除了导入配置类外,@Import注解还可以用来导入普通的组件,例如一个普通的Java类、接口或枚举。例如: ``` @Configuration @Import(MyComponent.class) public class AppConfig { // Configuration code... } ``` 在上面的例子中,AppConfig使用@Import注解来导入了一个名为MyComponent的普通Java组件。 3. 导入ImportSelector: @Import注解还可以使用ImportSelector类型的实现类来动态地导入一组组件,这些组件可以根据不同的条件进行选择。例如: ``` @Configuration @Import(MyImportSelector.class) public class AppConfig { // Configuration code... } ``` 在上面的例子中,AppConfig使用@Import注解来导入了一个名为MyImportSelector的ImportSelector实现类,它会根据不同的条件来选择一组组件,然后将它们动态导入到应用程序中。 总之,@Import注解是一个非常有用的注解,它可以帮助我们方便地导入其他配置类或组件,从而让我们的应用程序更加灵活和可扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值