(6)装配Bean配置(注解)

# 通过注解装配Bean

## 使用@Component 装配Bean

- 定义一个`POJO`:

```

@Component(value = "role")

public class Role {

@Value("1")

private Long id;

@Value("role_name_1")

private String roleName;

@Value("role_note_1")

private String note;

/*** setter and getter ***/

}

```

- **注解`@Component`代表Spring IoC会把这个类扫描生成`Bean`实例**

> - `value`

属性代表这个类在Spring中的`id` ,这就相当于XML方式定义的`Bean`的`id`

>> - 可以简写成`@Component("role")`

>> - 直接写成`@Component`,默认类名首字母小写为`id`

- 现在有了这个类,但是还不能进行测试,因为Spring IoC 并不知道需要去哪里扫描对象,这个时候可以使用一个`Java Config `来去告诉它

```

package com.ssm.chapter10.annotation.pojo;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan

public class PojoConfig {

}

```

- **包名和POJO一致**

- **`@ComponentScan`代表进行扫描,默认是扫描当前包的路径, `POJO`的包名和它保持一致才能扫描**

---

- 然后就可以通过`Spring`定义好的Spring IoC容器的

实现类`AnnotationConfigApplicationContext`去生成IoC容器(一般放在专门的`config`文件夹中)

```

public class AnnotationMain {

    public static void main(String[] args){

        ApplicationContext context =  new AnnotationConfigApplicationContext(PojoConfig.class);

        Role role = context.getBean(Role.class);

        System.err.println(role.getId();

```

---

- 扫描多个包

```

//1

@ComponentScan(basePackages = {"com.ssm.chapter10.annotation.pojo",

"com.ssm.chapter10.annotation.service"})

//2

@ComponentScan(basePackages = {"com.ssm.chapter10.annotation.pojo",

"com.ssm.chapter10.annotation.service"},

basePackageClasses = {Role.class, RoleServiceImpl.class})

```

- 难以注入对象

- 配置复杂

## 自动装配 @Autowired(推荐)

```

@Component

public class RoleController {

@Autowired

private RoleService roleService = null;

//同时也可以通过方法配置自动装配

@Autowired

public void setRole(Role role){

    this.role = role;

}

}

```

- IoC 容器有时候会寻找失败,在默认的情况下寻找失败它就会抛出异常,可以通过`@Autowired(required =false)`配置

- `@Autowired`是按**类型**,在存在多个相同类型的类时装配会失败

### 解决@Autowired歧义性

为了消除歧义性, `Spring` 提供了两个注解`@Primary` 和`@Qualifier`

- 注解`@Primary`代表首要的,配置在需要注入的类上,它是告诉Spring IoC 容器,请优先使用该类注入

- 注解`Qualifier`是通过按名称注入,常和`@component`等配合,例如

```

@Component("roleService3")

public class RoleServiceImpl3 implements RoleService {}

```

```

@Component

public class RoleController {

@Autowired

@Qualifier("roleService3")

private RoleService roleService = null;

}

```

## 使用@Bean 装配Bean

以上都是通过`@Component`装配`Bean` ,但是`@Component` 只能注解在类上,不能注解到方法上,这个时候我们可以使用`@Bean`来解决

- 比如我们需要使用DBCP 数据源, 这个时候要引入关于它的包

```

    @Bean(name = "dataSource")

public DataSource getDataSource(

Properties props = new Properties();

props.setProperty("driver", ....);

props.setProperty("url", ....);

props.setProperty("username", ....);

props.setProperty("password", ....);

DataSource dataSource = null;

try {

dataSource = BasicDataSourceFactory.createDataSource(props);

} catch (Exception e) {

e.printStackTrace();

}

return dataSource;

}

```

**`@Bean`包含四个配置项**

> - `name`:是一个字符串数组,允许配置多个BeanName

> - `autowire`:标志是否是一个引用的Bean对象,默认值是`Autowire.NO`

> - `initMethod`:自定义初始化方法

> - `destroyMethod`:自定义销毁方法

```

@Bean(name="juiceMaker2", initMethod="init", destroyMethod="myDestroy")

public JuiceMaker2 initJuiceMaker2() {

JuiceMaker2 juiceMaker2 = new JuiceMaker2();

juiceMaker2.setBeverageShop("贡茶");

Source source = new Source();

source.setFruit("橙子");

source.setSize("大杯");

source.setSugar("少糖");

    juiceMaker2.setSource(source);

return juiceMaker2;

}

```

# XML与注解混用

在现实中,使用XML或者注解各有道理,建议在自己的工程中所开发的类尽量使用注解方式,因为使用它并不困难, 甚至可以说

更为简单,而对于引入第三方包或者服务的类,尽量使用XML 方式,这样的好处是可以尽量对三方包或者服务的细节减少理解,也更加清晰和明朗。

- 例如:

配置数据源`spring-datasource.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-4.0.xsd">

<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://localhost:3306/chapter10" />

<property name="username" value="root" />

<property name="password" value="123456" />

</bean>

</beans>

```

- 在`xxxxx-config.java`中导入数据源

```

@ImportResource({"classpath:spring-dataSource.xml"})

public class ApplicationConfig {

.....

}

```

- 最后就可以注入

```

@Autowired

DataSource dataSource = null;

```

**在有多个config文件或者多个xml文件时可以进行导入:**

```

@Import({ApplicationConfig2.class,ApplicationConfig3.class})

public class ApplicationConfig {

.....

}

```

以及

```

<import resource = "spring-config.xml"/>

```

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