spring容器負(fù)責(zé)生成實(shí)例
- Set注入
這是最簡(jiǎn)單的注入方式金蜀,假設(shè)有一個(gè)SpringAction,類中需要實(shí)例化一個(gè)SpringDao對(duì)象闷游,那么就可以定義一個(gè)private的SpringDao成員變量惊奇,然后創(chuàng)建SpringDao的set方法(這是ioc的注入入口)
package com.bless.springdemo.action;
public class SpringAction {
//注入對(duì)象springDao
private SpringDao springDao;
//一定要寫被注入對(duì)象的set方法
public void setSpringDao(SpringDao springDao) {
this.springDao = springDao;
}
- 隨后編寫spring的xml文件,
- <bean>中的name屬性是class屬性的一個(gè)別名开仰,class屬性指類的全名拟枚,因?yàn)樵赟pringAction中有一個(gè)公共屬性Springdao,所以要在<bean>標(biāo)簽中創(chuàng)建一個(gè)<property>標(biāo)簽指定SpringDao众弓。
- <property>標(biāo)簽中的name就是SpringAction類中的SpringDao屬性名恩溅,ref指下面<bean name="springDao"...>,這樣其實(shí)是spring將SpringDaoImpl對(duì)象實(shí)例化并且調(diào)用SpringAction的setSpringDao方法將SpringDao注入.
- 構(gòu)造器注入
這種方式的注入是指帶有參數(shù)的構(gòu)造函數(shù)注入谓娃,看下面的例子脚乡,我創(chuàng)建了兩個(gè)成員變量SpringDao和User,但是并未設(shè)置對(duì)象的set方法滨达,所以就不能支持第一種注入方式奶稠,這里的注入方式是在SpringAction的構(gòu)造函數(shù)中注入俯艰,也就是說(shuō)在創(chuàng)建SpringAction對(duì)象時(shí)要將SpringDao和User兩個(gè)參數(shù)值傳進(jìn)來(lái):
public class SpringAction {
//注入對(duì)象springDao
private SpringDao springDao;
private User user;
public SpringAction(SpringDao springDao,User user){
this.springDao = springDao;
this.user = user;
System.out.println("構(gòu)造方法調(diào)用springDao和user");
}
public void save(){
user.setName("卡卡");
springDao.save(user);
}
- 在XML文件中同樣不用<property>的形式,而是使用<constructor-arg>標(biāo)簽锌订,ref屬性同樣指向其它<bean>標(biāo)簽的name屬性
- 通過(guò)@Autowired注解實(shí)現(xiàn)自動(dòng)裝配,只要你注入的bean已經(jīng)被spring管理就可以使用了
package com.cjwdemo.demoBySpring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.cjwdemo.demoBySpring.bean.Demo1;
import com.cjwdemo.demoBySpring.bean.Demo2;
@Configuration // @Configuration表示當(dāng)前類為配置類
/*
* @ComponentScan默認(rèn)掃描當(dāng)前包和子包的class文件
* 有@Controller或@Component或@Service或@Repository則自動(dòng)注冊(cè)到spring管理
*/
@ComponentScan
public class Application {
// 通過(guò)@Configuration和@Bean實(shí)現(xiàn)bean注冊(cè)
@Bean
public Demo1 setDemo1() {
return new Demo1();
}
public static void main(String[] args) {
/*
* ApplicationContext是BeanFactory的超類,需要通過(guò)配置類或xml配置文件創(chuàng)建出來(lái),
* 能通過(guò)該類直接獲取spring管理的bean
*/
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
Demo1 demo1 = context.getBean(Demo1.class);
demo1.test();
Demo2 demo2 = context.getBean(Demo2.class);
demo2.test();
}
}
// 獲取demo1 bean成功
// 獲取demo1 bean成功
package com.cjwdemo.demoBySpring.bean;
public class Demo1 {
public void test() {
System.out.println("獲取demo1 bean成功");
}
}
package com.cjwdemo.demoBySpring.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Demo2 {
@Autowired
private Demo1 demo1;
public void test() {
demo1.test();
}
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cjwdemo.demoBySpring</groupId>
<artifactId>demoBySpring</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>demoBySpring Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>demoBySpring</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>