IOC注解方式快速入門
1. 在spring4之后,想要使用注解形式,必須得要引入aop的包
2. 在配置文件當中,還得要引入一個context約束
<?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.xsd">
</beans>
3. 配置組件掃描
哪個包下的類型使用組合掃描
<?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.xsd">
<!--指定注解掃描包-->
<context:component-scan base-package="com.xzh.spring.demo1"/>
</beans>
4. 在類開上添加注解
必須在已經掃描包下
package com.xzh.spring.demo1;
import org.springframework.stereotype.Controller;
@Controller("user")
// 相當於配置文件中 <bean id="user" class="當前注解的類"/>
public class User {
public String name;
}
測試:
@Test
public void test() {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
5. 使用注解注入屬性
(1)可以不用提供set方法,直接在直接名上添加@value("值")
package com.xzh.spring.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
@Controller("user")
// 相當於配置文件中 <bean id="user" class="當前注解的類"/>
public class User {
@Value("IT666")
// 相當於配置文件中 <property name="name" value="IT666"/>
public String name;
}
測試:
@Test
public void test() {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
System.out.println(user.name);
}
(2)如果提供了set方法,在set方法上添加@value("值");
package com.xzh.spring.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
@Controller("user")
public class User {
public String name;
@Value("IT888")
public void setName(String name) {
this.name = name;
}
}
測試同(1)
IOC注解詳解
@Component
修改一個類,將這個類交給Spring管理。相當於在配置文件當中配置
<bean id="" class="">
@Component三個衍生注解
為了更好的進行分層,Spring可以使用其它三個注解,功能類似,目前使用哪一個功能都一樣, 后期可能會添加一些屬於各自的屬性。
@Controller:web層
@Service:service層
@Repository:dao層
@Controller("user")
public class User {
@Value("IT666")
public String name;
}
@Service("user")
public class User {
@Value("IT666")
public String name;
}
@Repository("user")
public class User {
@Value("IT666")
public String name;
}
屬性注入
@Value
設置普通屬性值
@Controller("user")
public class User {
@Value("IT666")
public String name;
}
@Autowired
(1)設置對象類型的屬性值,直接使用這種方式,是按照類型完全屬性注入,不需要在注解上使用id名稱
@Component("dog")
public class Dog {
@Value("旺財")
public String name;
}
@Controller("user")
public class User {
@Value("IT666")
public String name;
@Autowired
public Dog dog;
}
測試:
@Test
public void test() {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
System.out.println(user.name);
System.out.println(user.dog.name);
}
(2)習慣是按照名稱完成屬性注入,必須讓@Autowired注解與@Qualifier一起使用
@Component("dog")
public class Dog {
@Value("旺財")
public String name;
}
@Controller("user")
public class User {
@Value("IT666")
public String name;
@Autowired
@Qualifier("dog")
public Dog dog;
}
測試代碼同上。
(3)單獨使用@Resource,可以按照名稱完成屬性注入
@Component("dog")
public class Dog {
@Value("旺財")
public String name;
}
@Controller("user")
public class User {
@Value("IT666")
public String name;
@Resource(name = "dog")
public Dog dog;
}
測試代碼同上。
@PostConstruct 和 @PreDestroy
@PostConstruct 初始化方法,相當於
<bean init-method=""></bean>
@PreDestroy 銷毀方法,相當於
<bean destroy-method=""></bean>
@Controller("user")
public class User {
@Value("IT666")
public String name;
@Resource(name = "dog")
public Dog dog;
@PostConstruct
public void init(){
System.out.println("init----初始化");
}
@PreDestroy
public void destroy(){
System.out.println("destroy----銷毀");
}
}
測試:
@Test
public void test() {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
System.out.println(user.name);
System.out.println(user.dog.name);
((ClassPathXmlApplicationContext) applicationContext).close();
}
@scope
作用范圍
- singleton:默認的,Spring會采用單例模式創建這個對象。關閉工廠 ,所有的對象都會銷毀。
- prototype:多例模式。關閉工廠 ,所有的對象不會銷毀。內部的垃圾回收機制會回收。
@Controller("user")
@Scope("prototype")
public class User {
@Value("IT666")
public String name;
@Resource(name = "dog")
public Dog dog;
@PostConstruct
public void init(){
System.out.println("init----初始化");
}
@PreDestroy
// 作用范圍定為多例,此方法不會調用
public void destroy(){
System.out.println("destroy----銷毀");
}
}
XML與注解比較
- XML可以適用任何場景 ,結構清晰,維護方便
- 注解不是自己提供的類使用不了,開發簡單方便
XML與注解整合開發
- XML管理Bean
- 注解完成屬性注入
- 使用過程中, 可以不用掃描,掃描是為了類上的注解
在沒有掃描的情況下, 使用屬性注解@Resource @Value @Autowired @Qulifier
<context:annotation-config/>
public class Dog {
@Value("旺財")
public String name;
}
public class User {
@Value("IT666")
public String name;
@Resource(name = "dog")
public Dog dog;
@PostConstruct
public void init(){
System.out.println("init----初始化");
}
@PreDestroy
public void destroy(){
System.out.println("destroy----銷毀");
}
}
applicationContext.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.xsd">
<context:annotation-config/>
<bean id="user" class="com.xzh.spring.demo1.User"/>
<bean id="dog" class="com.xzh.spring.demo1.Dog"/>
</beans>
測試:
@Test
public void test() {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
System.out.println(user.name);
System.out.println(user.dog.name);
((ClassPathXmlApplicationContext) applicationContext).close();
}