idea配置SpringBean应用

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


image.png

默认初始生成的配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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.xsd">

</beans>

在该配置文件Spring-Bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="zooBean" class="com.spring.model.ZooBean" >
        <property name="tiger" ref="tiger" />
        <property name="monkey" ref="monkey" />
    </bean>

    <bean id="tiger" class="com.spring.model.Tiger" />
    <bean id="monkey" class="com.spring.model.Monkey" />
    
</beans>

编写测试类

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标注的变量中。

<?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.spring" />

    <bean id="zooAutowired" class="com.spring.model.ZooAutowired" />
    <bean id="tiger" class="com.spring.model.Tiger" />
    <bean id="monkey" class="com.spring.model.Monkey" />
    
</beans>

@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的名称

<?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.spring" />

    <bean id="carFactory" class="com.spring.model.CarFactory" />
    <bean id="bmwCar" class="com.spring.service.impl.BMWCar" />
    <bean id="benz" class="com.spring.service.impl.BenzCar" />
    
</beans>

定义接口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"

<?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.spring" />
    
</beans>

定义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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容