Spring 提供了方法來更有效的管理創建物件,使得我們不一定要從程式中去建立物件,配置物件,只需藉由Spring Xml 中 bean 的設定即可達到對物件的管理與配置,如此也使我們的物件可以更有效的被管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class HelloWorld { ........ } public class MyService { ........ } public class MyUserDao { ........ } public class MyController { ........ } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="helloWorld " class="com.springmvc.demo.MyUser" /> <bean id="myService " class="com.springmvc.demo.MyUser" /> <bean id="myUserDao " class="com.springmvc.demo.MyUser" /> <bean id="myController " class="com.springmvc.demo.MyUser" /> </beans> |
以上就是透過在xml中加入bean的方式將 class 註冊於Spring中,如此我們就可於xml去管理這個物件,這也就是Spring的核心思想( Ioc ) ,而從Spring 2.0 開始更提供了另一個方法[ 註解 ]去簡化Spring xml 的設定,註解基於Spring 就等同於bean,而 @Service ,@Controller ,@Repository, @Component 就是可以註解在 class 上的四大類 ,目前來說此四類在Spring 中都是可被註冊為Bean的,
@Component : 是一個泛型的註解 ,可以被轉換為其他3個類型
@Service : 對應於服務層的註解
@Repository : 對應於數據訪問層(Dao)
@Controller : 對應於控制層 ( mvc 中 action 的應用 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@Component public class HelloWorld { ........ } @Service public class MyService { ........ } @Repository public class MyUserDao { ........ } @Controller public class MyController { ........ } |
接著只要我們在 Spring 的 xml 中加入
1 |
<context:component-scan base-package="com.springmvc.demo" /> |
去啟動自動掃描 ,所以有加入註釋的 class 就會自動被註冊為 Spring <bean>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/ spring-context-3.0.xsd"> <context:component-scan base-package="com.springmvc.demo" /> </beans> 於此Spring就會自動去掃描 com.springmvc.demo 所有的 class 有加入的註解註冊為bean |
如此一來我們的 xml 也就簡化了許多,而註解於bean中的默認名稱為 class名稱(第一個字母小寫)
1 2 |
@Service public class MyService {........} |
這個例子來說 bean 的名稱就是 myService 如果想自已定義 bean 的名稱可用@service(“name”)
1 2 |
@Service("helloWorld") public class MyService {........} |
如此一來bean的名稱就為 helloWorld,這總方式產生的bean預設 是singleton(單一的),意思就是說容器只會產生這個bean一次,以下列例子來說
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@Service("user") public class MyUser { private String name = "yang"; public void getName() { System.out.println(name); } public void setName(String name) { this.name= name; } } public class MyWeb { @Autowired private WebApplicationContext context; public static void main(String[] args) { MyUser userA = (MyUser) context.getBean("user"); userA.setName("wang"); userA.getName(); MyUser userB = (MyUser) context.getBean("user"); userB.getName(); } } |
以上述例子來說結果就會是
wang
wang
因為 user 只會被創建一次,所以 userB 一樣是使用之前被創建的 user,所以取出來的值會是一樣的,但如果我們加入@Scope(“prototype”)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Service("user") @Scope("prototype") public class MyUser { private String name; public void getName() { System.out.println(name); } public void setName(String name) { this.name= name; } } |
結果就會是
wang
yang
因為 prototype就是每次取得Bean時,容器會建立一個新的Bean,而不是傳回同一個Bean,所以userB會在創建一個 user 此時 userB 取出來的值就會是 user 的預設值 yang。
總結 : 註解是Spring提供的另一個方式去配置class於容器中,而不需設定在xml中,妥善的使用註解也可使我們的應用程式更為簡潔,當然Spring還提供其他的註解,此篇介紹的是屬於使用於class上面的四類註解,接下來我也將繼續探討其他的註解