idea配置SpringBean应用

一、在src/main/resource/目录中点击右键,New->XML Configure file->Spring Config,并给文件命名为:Spring-Bean


idea配置SpringBean应用_第1张图片
image.png

默认初始生成的配置如下





在该配置文件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

你可能感兴趣的:(idea配置SpringBean应用)