一、在src/main/resource/目录中点击右键,New->XML Configure file->Spring Config,并给文件命名为:Spring-Bean
默认初始生成的配置如下
在该配置文件Spring-Bean.xml中添加以下内容:
编写测试类
package com.spring.maintest;
import com.spring.model.ZooBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanTest {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("Spring-Bean.xml");
ZooBean zoo=(ZooBean) ctx.getBean("zooBean");
System.out.println(zoo.toString());
}
}
定义Tiger类
package com.spring.model;
public class Tiger {
private String tigerName="TigerKing";
public String toString(){
return "TigerName:"+tigerName;
}
}
定义Monkey类
package com.spring.model;
public class Monkey {
private String monkeyName = "MonkeyKing";
public String toString(){
return "MonkeyName:" + monkeyName;
}
}
定义ZooBean类
package com.spring.model;
public class ZooBean {
private Tiger tiger;
private Monkey monkey;
public Tiger getTiger() {
return tiger;
}
public void setTiger(Tiger tiger) {
this.tiger = tiger;
}
public Monkey getMonkey() {
return monkey;
}
public void setMonkey(Monkey monkey) {
this.monkey = monkey;
}
public String toString(){
return tiger + "\n" + monkey;
}
}
调试输出如下
TigerName:TigerKing
MonkeyName:MonkeyKing
二、@Autowired
自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
@Autowired(required=false)
如果属性在bean里找不到,又不想让Spring容器抛出异常,而就是显示null
定义ZooAutowired类
package com.spring.model;
import org.springframework.beans.factory.annotation.Autowired;
public class ZooAutowired {
@Autowired
private Tiger tiger;
@Autowired
private Monkey monkey;
public String toString(){
return tiger + "\n" + monkey;
}
}
定义测试类AutowiredTest
package com.spring.maintest;
import com.spring.model.ZooAutowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AutowiredTest {
public static void main(String[] args) {
//设值注入 创建Spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring-Autowired.xml");
ZooAutowired zoo=(ZooAutowired) ctx.getBean("zooAutowired");
System.out.println(zoo.toString());
}
}
控制台输出如下
TigerName:TigerKing
MonkeyName:MonkeyKing
三、@Qualifier
如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称
定义接口ICar
package com.spring.service;
public interface ICar {
public String getCarName();
}
定义接口实现类BenzCar
package com.spring.service.impl;
import com.spring.service.ICar;
public class BenzCar implements ICar {
public String getCarName(){
return "Benz car";
}
}
定义接口实现类BMWCar
package com.spring.service.impl;
import com.spring.service.ICar;
public class BMWCar implements ICar {
public String getCarName(){
return "BMW car";
}
}
定义CarFactory
package com.spring.model;
import com.spring.service.ICar;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class CarFactory {
//@Qualifier 如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称
@Autowired
@Qualifier("bmwCar")
private ICar car;
public String toString(){
return car.getCarName();
}
}
定义测试类QualifierTest
package com.spring.maintest;
import com.spring.model.CarFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class QualifierTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring-Qualifier.xml");
CarFactory carFactory=(CarFactory) ctx.getBean("carFactory");
System.out.println(carFactory.toString());
}
}
运行输出
BMW car
四、@Service
@Service注解,其实做了两件事情:
1、声明当前类是一个bean。使得其他的类才可以使用@Autowired将当前类作为一个成员变量自动注入。
2、被注解的当前类在bean中的id是首字母小写的类名。
3、可以@Service("Zoo") ,在Spring容器中的名字叫做"Zoo"
定义TigerService
package com.spring.model;
import org.springframework.stereotype.Service;
@Service
public class TigerService {
private String tigerName="TigerKing";
public String toString(){
return "TigerName:"+tigerName;
}
}
定义MonkeyService
package com.spring.model;
import org.springframework.stereotype.Service;
@Service
public class MonkeyService {
private String monkeyName = "MonkeyKing";
public String toString(){
return "MonkeyName:" + monkeyName;
}
}
定义ZooService
package com.spring.model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ZooService {
@Autowired
private TigerService tiger;
@Autowired
private MonkeyService monkey;
public String toString(){
return tiger + "\n" + monkey;
}
}
编写测试类ServiceTest
package com.spring.maintest;
import com.spring.model.ZooService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ServiceTest {
public static void main(String[] args) {
//设值注入 创建Spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring-Service.xml");
ZooService zoo=(ZooService) ctx.getBean("zooService");
System.out.println(zoo.toString());
}
}
运行输出如下
TigerName:TigerKing
MonkeyName:MonkeyKing
五、@Scope注解
Spring默认产生的bean是单例的,假如我不想使用单例怎么办,xml文件里面可以在bean里面配置scope属性。注解也是一样,配置@Scope即可,默认是"singleton"即单例,"prototype"表示原型即每次都会new一个新的出来。
例如:@Scope("prototype")
六、@Controller
@Controller对应表现层的Bean,也就是Action
使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。
如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字
@Service对应的是业务层Bean
@Repository对应数据访问层Bean
参考:
https://www.cnblogs.com/xiaoxi/p/5935009.html
http://www.cnblogs.com/xiaoxi/p/5930736.html