spring在进行装配bean时,提供了三种主要的装配机制:
- 自动化装配bean
- 通过java代码装配bean
- 通过xml装配bean
- 自动化装配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,本来快写好了,去个厕所浏览器竟然关闭了,不火,不火。。。