Spring装配
自动化装配
1)组件装配@Component、Autowirring
2)自动装配@Configuration@ComponentScan Component
接口创建:
package com.bean;
public interfaceTest_Auto_player {
void player();
}
接口实现:
package com.bean;
import org.springframework.stereotype.Component;
//可以为组件扫描的bean命名,例如:、、//@Component("Test_Auto_player")或者://@Name("Test_Auto_player")
@Component//此处定义组件
public classTest_Auto_playerImpl implements Test_Auto_player {
privateStringtitle="title";
privateStringcontent="content";
public void player() {
System.out.println(title+"content****:"+content);
}}
扫描包:
package com.bean;
importorg.springframework.context.annotation.ComponentScan;
importorg.springframework.context.annotation.Configuration;
/**
* 显示的配置一下(原因是:组件扫描是不启用的)
* @ComponentScan:会默认扫描当前所在包
*/
@Configuration
@ComponentScan
public classTest_AutoConfig {
}
测试:
package com.bean;
import staticorg.junit.Assert.*;
import org.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.test.context.ContextConfiguration;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Test_AutoConfig.class)
public class AutoTest{
@Autowired//注入组件,一般企业项目中组件都是接口,在调用的时候直接spring机制会直接调用接口对应实现的类方法
private Test_Auto_player cd;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
cd.player();//直接调用方法:实际是注入接口所实现的方法
}
}
在测试时报错:
原因是缺少jar包:commons-logging
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
atorg.springframework.test.context.junit4.SpringJUnit4ClassRunner.<clinit>(SpringJUnit4ClassRunner.java:91)
atsun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
atsun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
atjava.lang.reflect.Constructor.newInstance(Unknown Source)
atorg.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
atorg.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
atorg.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
atorg.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
atorg.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
atorg.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
atorg.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)
atorg.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
atorg.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by:java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
atjava.net.URLClassLoader$1.run(Unknown Source)
atjava.net.URLClassLoader$1.run(Unknown Source)
atjava.security.AccessController.doPrivileged(Native Method)
atjava.net.URLClassLoader.findClass(Unknown Source)
atjava.lang.ClassLoader.loadClass(Unknown Source)
atsun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
atjava.lang.ClassLoader.loadClass(Unknown Source)
...18 more*/
使用xml扫面组件:
test_autoConfig.xml
<context:component-scanbase-package="com.bean"></context:component-scan>
@ContextConfiguration("classpath:test_autoConfig.xml")