spring学习6----装配bean(自动化装配bean)

spring在进行装配bean时,提供了三种主要的装配机制:

  • 自动化装配bean
  • 通过java代码装配bean
  • 通过xml装配bean
  1. 自动化装配bean

步骤:

(1)创建bean

package com.study;

import org.springframework.stereotype.Component;

@Component
public class Book {
    private String bookName;
    private String bookAuthor;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookAuthor() {
        return bookAuthor;
    }

    public void setBookAuthor(String bookAuthor) {
        this.bookAuthor = bookAuthor;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", bookAuthor='" + bookAuthor + '\'' +
                '}';
    }
}

Book类使用了@Component注解,该注解表明该类会组为组件类,并告知spring要为这个类创建bean,但是组件扫描默认是不启用的,启用组件扫描的方式有两种:

(1)通过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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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.xsd">

    <context:component-scan base-package="com.study"/>
</beans>

测试代码:

package com.test;

import com.study.Book;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestBean {
    @Test
    public void testBean() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Book book = (Book) context.getBean("book");
        book.setBookName("红楼梦");
        book.setBookAuthor("曹雪芹");
        System.out.println(book.getBookAuthor() + "writed" + book.getBookName());
    }
}

测试结果:

(2)@ComponentScan注解启用了组件扫描

代码:

package com.study;

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

@Configuration
@ComponentScan
public class BookConfig {
}

@ComponentScan并没有显示的声明任何bean,只不过使用了@ComponentScan,这个注解能在sprig中启用组件扫描;如果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包,因为BookConfig类位于com.study包中,因此spring将会扫描这个包及此包下的所有子包。

测试代码:

package com.test;

import com.study.Book;
import com.study.BookConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class testBean1 {
    @Test
    public void bookTest(){
        ApplicationContext context =

                new AnnotationConfigApplicationContext(BookConfig.class);
        Book book = (Book) context.getBean("book");
        System.out.println(book);
    }

}

测试结果:

(2)为组件扫描的bean命名

在(1)中并没有为Book bean设置id,但是spring会根据类名为它指定一个id,也就是将类名的第一个字母变成小写,但是我们也可以根据自已的意愿为其设置id。eg:@Component(value="myBook")

(3)设置组件扫描的基础包

在(1)中没有为@ComponentScan设置任何属性,按照默认规则,它会以配置类所在的包作为基础包来扫描组件,为了指定不同的基础包,可以在@ComponentScan的value属性中指明包的名称。

eg:@ComponentScan(basePackages={"com.study","com.study1"})

(4)通过为bean添加注解实现自动装配

通过自动装配,将一个MyBook注入到Book之中

package com.study;

import org.springframework.stereotype.Component;

@Component
public class MyBook {
    public void test(){
        System.out.println("this is MyBook class");
    }
}
package com.study;

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

@Component
public class Book {
    private String bookName;
    private String bookAuthor;
    private MyBook myBook;

    public void test() {
        System.out.println("this is book class");
        myBook.test();
    }

    public MyBook getMyBook() {
        return myBook;
    }
    @Autowired
    public void setMyBook(MyBook myBook) {
        this.myBook = myBook;
    }

   其他get() set().....
    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", bookAuthor='" + bookAuthor + '\'' +
                '}';
    }
}

测试代码:

package com.test;

import com.study.Book;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestBean {
    @Test
    public void testBean() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Book book = (Book) context.getBean("book");
        book.test();
        book.setBookName("红楼梦");
        book.setBookAuthor("曹雪芹");
        System.out.println(book.getBookAuthor() + "writed" + book.getBookName());
    }
}

测试结果:

@Autowired不仅能够用在属性的Setter方法上还能够用在构造器上,@Autowired是spring特有的注解,但是你也可以使用@Inject

写到这不容易a,本来快写好了,去个厕所浏览器竟然关闭了,不火,不火。。。

猜你喜欢

转载自blog.csdn.net/sunaxp/article/details/81149217
今日推荐