网站首页幻灯片尺寸,深圳市保障性住房申请官网,做网站在哪接广告,工程公司简介范文大全目录
一、Bean 的简单使用
1、正常情况
2、问题提出
二、解决方案
1、Qualifier
2、直接写方法名
三、特殊情况
1、DataSource 一、Bean 的简单使用
在开发中#xff0c;基于 XML 文件配置 Bean 对象的做法非常繁琐且不好维护#xff0c;因此绝大部分情况下都是使用…目录
一、Bean 的简单使用
1、正常情况
2、问题提出
二、解决方案
1、Qualifier
2、直接写方法名
三、特殊情况
1、DataSource 一、Bean 的简单使用
在开发中基于 XML 文件配置 Bean 对象的做法非常繁琐且不好维护因此绝大部分情况下都是使用“完全注解开发”。
对于 Spring 而言IOC 容器中的 Bean 对象的创建和使用是一大重点Spring 也为我们提供了注解方式创建 bean 对象使用 Bean。
在举例之前先熟悉以下两个需要用到的类
1User 类
package com.demo.pojo;import org.springframework.stereotype.Component;Component
public class User {private String name;public void setName(String name) {this.name name;}Overridepublic String toString() {return User{ name name \ };}
}2Book 类
package com.demo.pojo;import org.springframework.stereotype.Component;Component
public class Book {private User user;public void setUser(User user) {this.user user;}public User getUser() {return user;}
}1、正常情况
1下面是一个简单的 bean 对象创建
Bean
public User getUser() {return new User();
}
经此操作IOC 中就会多出一个与 bean id getUser class 类路径.User/ 同义的 bean 对象。即方法名就是 id返回类型就是 class。 2含有普通类型参数的 bean 对象创建
Bean
public User getUser(Value(wyt) String name) {User user new User();user.setName(name);return user;
}
需要注意的是方法中的参数并不是 bean 对象的成员属性而是代表着 bean 对象的创建依赖于这几个参数或许用来 setParameter或许只是中间变量。
而在 xml 文件中的 property 则必须要求用 set 方法。
3含有对象类型参数的 bean 对象创建
package com.demo.config;import com.demo.pojo.Book;
import com.demo.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;Configuration
public class Config {Beanpublic User getUser(Value(wyt) String name) {User user new User();user.setName(name);return user;}Beanpublic Book createBook(User user) {Book book new Book();book.setUser(user);return book;}
}对比在 xml 中是如何实现参数是对象类型时的属性注入 4正常情况下Bean 使用总结
4-1Bean 注解的方法其返回值就是一个 bean 对象并且注册到了 IOC 容器中。
id 为方法的名字class 为方法的返回类型
4-2Bean 对象的实例化依赖于方法内的参数参数可以是普通类型也可以是对象类型。
若为普通类型用 Value(xxx) 来注入这个参数若为对象类型则默认情况下Spring 会到 IOC 容器中寻找与参数类型相同的 bean 对象来注入这个参数
2、问题提出
根据上述内容我们会想到如果参数是对象类型可是 IOC 中拥有不止一个相同类型的 bean 对象这该怎么办呢
比如下面的情况 可以看到Book 对象的参数 user 已经报错了无法自动装配因为存在多个 User 类型的 BeanSpring 不知道应该将哪个 bean 注入到 user 中。
二、解决方案
首先我们要知道默认情况下参数的注入使用的是 Autowired不需要显式写出。
1、Qualifier
我们可以想到Autowired 是根据类型自动装配当一个类型有多个 bean 对象时失效。
而 Qualifier 是根据名称进行装配这不就意味着我们可以用 Qualifier 来明确需要的 bean 对象嘛。
这有两种写法都是有效的
直接在参数前加 Qualifier(function_name)在方法前加 Qualifier(function_别名)在参数前加 Qualifier(function_别名)
1配置类
package com.demo.config;import com.demo.pojo.Book;
import com.demo.pojo.User;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;Configuration
public class Config {Beanpublic User getUser(Value(wyt) String name) {User user new User();user.setName(name);return user;}Beanpublic User createUser(Value(wyt) String name) {User user new User();user.setName(name);return user;}Beanpublic Book createBook(Qualifier(createUser) User user) {Book book new Book();book.setUser(user);return book;}
}2测试代码
Test
public void SameObjectTest() {ApplicationContext context new AnnotationConfigApplicationContext(Config.class);Book book context.getBean(createBook, Book.class);System.out.println(book.getUser());
}
3输出结果 2、直接写方法名
因为一般情况下方法名不能相同因此也可以通过将参数名写成对应的方法名来进行注入。
package com.demo.config;import com.demo.pojo.Book;
import com.demo.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;Configuration
public class Config {Beanpublic User getUser(Value(wyt) String name) {User user new User();user.setName(name);return user;}Beanpublic User createUser(Value(wyt) String name) {User user new User();user.setName(name);return user;}Beanpublic Book createBook(User createUser) {Book book new Book();book.setUser(createUser);return book;}
}三、特殊情况
在这里要说明一些特别的对象类型比如DataSource。
1、DataSource
1问题描述
Bean
public DruidDataSource createDruidDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;
}Bean
public DruidDataSource getDruidDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;
}
当我们像上面的代码一样写了两个数据源的 bean 对象之后运行就会出现如下报错 No qualifying bean of type javax.sql.DataSource available: expected single matching bean but found 2 简单来说就是因为 Spring 有其自身的配置类导致程序不知道选择哪一个数据源。
2解决方法
给其中任意一个加上 Primary代表当出现多个同类型 bean 时优先使用哪一个。写上之后就可以使用前文所述的方法如Qualifier 或直接写方法名。
Bean
Primary
public DruidDataSource createDruidDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;
}