1Spring容器
(1)容器的定義:生產實例的工廠,管理容器中的bean.
(2)bean的定義:bean是Spring管理的基本對象,所有的組件都能都當成bean進行管理。Spring容器負責管理bean的生命週期,創建bean、裝配bean、銷燬bean。
(3)spring核心接口:BeanFactory和ApplicationContext。BeanFactory:負責配置、創建、管理Bean。ApplicationContext是BeanFactory的一個接口,因此稱之爲上下文,spring容器負責管理Bean與Bean之間的依賴關係。
(4)DI:依賴注入,主要是通過外部的方式實現注入的。能夠實現對象之間的解耦。
(5)IOC:控制反轉,將bean注入到其他的類中時,關於bean的創建、裝配、銷燬都交給了Spring容器。
2裝配Bean
(1)注入bean的方式(DI):
1)構造器注入。
2)get、set方式注入(屬性注入)。
3)接口注入。
(2)裝配Bean的方式:
1)XML方式裝配Bean。
2) java中顯示配置。
3)隱式的bean發現機制和自動裝配。
(3)裝配bean
1)組件掃描(component scanning):Spring會發現應用上下文所創建的bean。
2)自動裝配(autowiring):Spring自動滿足bean之間的裝配。
–>在裝配Bean的時候,首先在Spring的上下文能夠通過某些標識(例如@Component)識別這個類是一個組件,繼而,關於這個組件後續的一切交給Spring容器了。Spring容器識別這個組件後,纔會將它裝配成Bean,創建成Bean,管理Bean的一切。類要做的就是讓Spring容器識別它是一個bean,讓Spring容器可以識別的註解包括:@Component 、@Repository、@ Controller、@Service 、@Configration一般和@Bean一起使用。
–>Spring要做的就是能夠發現在Spring的上下文中組件,然後管理這些組件,將這些組件裝配成Bean。Spring識別組件的註解@ComponentScan。
3例子
/**
*聲明這個類爲組件類,並告知Spring要爲他創建bean
*同樣聲明組件的註解還有:
*/
@Component
public class SgtPeppers {
private String title = "play...SgtPeppers implements CompactDisc";
public void play() {
System.out.println(title);
}
}
@Component註釋的類,能夠被Spring識別爲組件,Spring容器會爲這個類生成bean。
測試類
public class TestDemo extends BaseTestCase {
@Autowired
private SgtPeppers sgtPeppers;
@Test
public void test() {
sgtPeppers.play();
}
}
我封裝了一下測試類
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { AppleApplication.class })
public abstract class BaseTestCase {
}
在AppleApplication中有掃描整個類的註解。
AppleApplication代碼, @SpringBootApplication中包含幾個註解,它會掃描所有以”com.demo”開始的包內的註解。
@SpringBootApplication(scanBasePackages = { "com.demo" })
public class AppleApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(getClass());
}
public static void main(String[] args) {
new SpringApplicationBuilder(AppleApplication.class).bannerMode(Banner.Mode.OFF).web(true).run(args);
}
}