Spring之旅(一、装配Bean)

Spring之旅(一、装配Bean)

声明bean

构造器注入和setter注入

装配bean

控制bean的创建和销毁


Spring装配的三种机制

  1. 在XML中进行显示的配置
  2. 在JAVA中机芯显示的配置
  3. 隐式的bean发现机制和自动装配

下面用一个例子来对装配bean进行讲解

首先新建一个MAVEN项目:

  1. 右键点击,新建:
    新建maven项目
  2. 选择maven project:
    这里写图片描述
  3. 点击下一步:
    这里写图片描述
  4. 选择quickstart:
    这里写图片描述
  5. 输入项目名称,点击完成
    这里写图片描述
  6. 引入测试要用到的jar包
  7. 新建CompactDisc接口:
 package com.pactera.helloSpring;

public interface CompactDisc {
    void play();
}
  1. 新建SgtPeppers实现类,注意类上面的注解:Component。 这个简单的注解就是说明该类会作为组件类,并告知Spring要为这个类创建bean。虽然已经注解了Component,但是Spring不会主动的去扫描这些组件,需要我们显示的配置一下
package com.pactera.helloSpring;

import org.springframework.stereotype.Component;

@Component
public class SgtPeppers implements CompactDisc {

    private String title = "liuy is put"; 
    private String artist  = "the baetles";
    @Override
    public void play() {
        System.out.println("Playing " + title + " by " + artist);

    }

}
  1. 用配置类型实现组件扫描,只需要把这个类建在和SgtPeppers 相同的包,或者他的父包体中,spring就会启动扫描组件。去扫描了其所在包下的所有带有Component注解的类。自动创建bean。
package com.pactera.helloSpring;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig {

}

还可以用xml进行配置

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan  base-package="com.pactera.helloSpring">
    </context:component-scan>

</beans>
  1. 现在可以写一个测试类进行测试:
package com.pactera.helloSpring;

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;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull(){
        cd.play();

    }
}

右键点击Junit测试,就能发现这个测试类能正常运行。

package com.pactera.helloSpring;

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;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath*:bean.xml"
    })
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull(){
        cd.play();

    }
}

使用XML如上面的代码, 运行时会报下面的错误,是因为米有导入相应的包

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<clinit>(SpringJUnit4ClassRunner.java:96)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 18 more

引入下面的包就可以了

<dependency>
              <groupId>commons-logging</groupId>
              <artifactId>commons-logging</artifactId>
              <version>1.2</version>
              <scope>compile</scope>
        </dependency>

简单的测试就做完了

猜你喜欢

转载自blog.csdn.net/kk6891/article/details/78267139