基於 Java container的annotation最主要就是@Configuration和@Bean
※@Configuration和@Bean
BookAction.java
@Configuration
public class BookAction {
@Inject
private IBookService service;
@Bean(name = "og")
public String go() {
return service.get();
}
}
IBookService.java和BookServiceImpl.java
public interface IBookService {
public String get();
}
@Named
public class BookServiceImpl implements IBookService {
@Inject
private BookDAOImpl dao;
public String get() {
return dao.getBook();
}
}
BookDAOImpl.java
@Component
public class BookDAOImpl {
public String getBook() {
return "資料庫操作";
}
}
測試類
ApplicationContext ctx3 = new AnnotationConfigApplicationContext(BookAction.class, BookServiceImpl.class, BookDAOImpl.class);
System.out.println(ctx3.getBeanDefinitionCount());
for (String s : ctx3.getBeanDefinitionNames()) {
System.out.println(s);
}
System.out.println("----------------------------------------");
// BookAction controller = (BookAction) ctx3.getBean("bookAction");
BookAction controller = ctx3.getBean(BookAction.class);
System.out.println(controller.go());
((AnnotationConfigApplicationContext) ctx3).close();
※結果:
9
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
bookAction
bookServiceImpl
bookDAOImpl
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
og
----------------------------------------
資料庫操作
※如果只設定@Bean,那id就是方法名稱
※@Bean不能在回傳值是void上面,否則會出「needs to have a non-void return type!」的錯
※@Named、@Component、@Controller、@Service、@Repository、@Configuration可混用
※@Autowired、@Resource、@Inject可混用
※測試類的BookAction那兩行都可以,本來是呼叫id,也還是可以用,現在變成呼叫class
※還可以這樣使用:
AnnotationConfigApplicationContext ctx3 = new AnnotationConfigApplicationContext();
ctx3.register(BookAction.class, BookServiceImpl.class);
ctx3.register(BookDAOImpl.class);
// ctx3.scan("\\");
ctx3.refresh();
※scan()等同xml設定的<context:component-scan base-package="\" />
※@Bean的初始銷毀方法
BookAction.java
@Configuration
public class BookAction {
@Inject
@Named("bookServiceImpl")
private IBookService service;
@Bean(name = "og", initMethod = "ooo", destroyMethod = "xxx")
public IBookService go() {
return service.get();
}
}
IBookService.java和BookServiceImpl.java
public interface IBookService {
public IBookService get();
}
@Named
public class BookServiceImpl implements IBookService {
@Inject
private BookDAOImpl dao;
public void ooo() {
System.out.println("ooo");
}
public void xxx() {
System.out.println("xxx");
}
public IBookService get() {
return this;
}
}
※@Named("bookServiceImpl")是因為會出「 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [service.IBookService] is defined: expected single matching bean but found 2: bookServiceImpl,og」的錯,有兩個id的型態都是IBookService,所以才加這行,@Named就是這兩種用法,就是上一篇介紹的連結,有一張表寫的很清楚
※initMethod 和 destroyMethod 要寫在回傳值的class裡面才行,但我試過回傳null就不會執行了(但也不會出錯),所以一定真的有到class裡面才行,就算是new個空的也會抓到
沒有留言:
張貼留言