(四)SpringIoc之Bean装配
- 在pom.xml的依赖
<dependencies>
<!--测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.11</version>
</dependency>
<!--spring 上下文-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
<!--织入包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--高速代理生成包-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
</dependencies>
2.创建实体类Person和Computer两个实体类
package com.qf.pojo;
public class Computer {
String disk;
String cpu;
String memory;
String gpu;
public Computer() {
System.out.println("空参构造");
}
public Computer(String disk, String cpu, String memory, String gpu) {
this.disk = disk;
this.cpu = cpu;
this.memory = memory;
this.gpu = gpu;
}
public String getDisk() {
return disk;
}
public void setDisk(String disk) {
this.disk = disk;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getGpu() {
return gpu;
}
public void setGpu(String gpu) {
this.gpu = gpu;
}
@Override
public String toString() {
return "Computer{" +
"disk='" + disk + '\'' +
", cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
", gpu='" + gpu + '\'' +
'}';
}
}
package com.qf.pojo;
import java.util.List;
public class Person {
String name;
int age;
Computer computer;
List<String> girlFriend;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Computer getComputer() {
return computer;
}
public void setComputer(Computer computer) {
this.computer = computer;
}
public List<String> getGirlFriend() {
return girlFriend;
}
public void setGirlFriend(List<String> girlFriend) {
this.girlFriend = girlFriend;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", computer=" + computer +
", girlFriend=" + girlFriend +
'}';
}
}
3.配置spring-config.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">
<!--Id和name:使用基本一致,name允许有一些特殊字符,name和id都唯一-->
<!--scope默认为singleton-->
<!--如果是属性注入,需要为每一个依赖类创建相应的getter和setter方法
-->
<!--属性装配-->
<bean class="com.qf.pojo.Computer" name="myComputer" scope="prototype" id="computer1">
<property name="disk" value="i7 7700HQ"></property>
<property name="memory" value="16GB"></property>
<property name="cpu" value="256G SSD 1TB"></property>
<property name="gpu" value="NVIDIA 1060"></property>
</bean>
<!--构造装配,Computer必须有有参构造和无参构造-->
<bean class="com.qf.pojo.Computer" name="computer">
<constructor-arg name="cpu" value="i9 9700HQ"></constructor-arg>
<constructor-arg name="disk" value="512G SSD"></constructor-arg>
<constructor-arg name="gpu" value="NVIDIA 2080"></constructor-arg>
<constructor-arg name="memory" value="64G"></constructor-arg>
</bean>
<!--自动装配autowire,默认按byType自动装配-->
<!--下面没有装配Computer,autowire会自动装配-->
<bean class="com.qf.pojo.Person" name="zhangsan" autowire="byName">
<property name="name" value="张三"></property>
<property name="age" value="18"></property>
<property name="girlFriend">
<!--集合装配-->
<list>
<value>小娜</value>
<value>小莎</value>
<value>小琪</value>
</list>
</property>
</bean>
</beans>
自动装配
- byName:通过
反射到Person类,找到没有装配的Computer computer,根据computer和每个bean的name/id匹配,相同就装配,如果没有相同的就抛出异常。 - byType:通过
反射到Person类,找到没有装配的Computer属性, 按Bean的包名.class的class来匹配的,如果有多个class相同抛异常。 - autowired按byType自动注入.
4.创建测试类TestSpringIoc
public class TestSpringIoc {
public static void main(String[] args) {
<!--可以初始化多个xml-->
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-ioc.xml");
Computer computer1 =(Computer)context.getBean("computer1");
System.out.println(computer1);
Person person = (Person)context.getBean("zhangsan",Person.class);
System.out.println(person);
}
}
集合装配:如果对应bean的属性是一个集合则需要使用集合装配,Spring支持多种集合装配类型:
- 对应类型为java.util.List、java.util.Vector 、java.util.Collection 、数组的属性
- 对应类型为java.util.Set的属性
- 对应类型为java.util.Map的属性
- 对应类型为java.util.Properties的属性
示例
<!--List装配:-->
<property name=“list">
<list>
<value>a</value>
<value>b</value>
</list>
</property>
<!--Set装配:(HashSet如何去重复,hashCode)-->
<property name=“set">
<set>
<value>a</value>
<value>b</value>
</set>
</property>
<!--Map装配:-->
<property name=“map">
<map>
<entry key="1" value=“a"></entry>
<entry key="2" value=“b"></entry>
</map>
</property>
Annotation注解模式实现装配
1.修改spring-ioc.xml文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--声明使用注解开发-->
<context:annotation-config></context:annotation-config>
<!--组件扫描,扫描com.qf.pojo,如果含有spring组件注解,将被spring容器管理-->
<context:component-scan base-package="com.qf.pojo"></context:component-scan>
</beans>
2.创建新的PersonAnnotation类
<!--定义为spring组件-->
@Component("personAnnotation")
public class PersonAnnotation {
@Value("18")
int age;
@Value("张三")
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PersonAnnotation{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
3.创建新的测试类
public class AnnotationTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
PersonAnnotation personAnnotation = applicationContext.getBean("personAnnotation", PersonAnnotation.class);
System.out.println(personAnnotation);
}
}
- Annotation的优缺点:
- 优点:灵活、简单、开发效率高
- 缺点:在不合适的情况下,滥用注解会违反ioc的思想
(四)SpringIoc之Bean装配的更多相关文章
- Spring Boot源码(四):Bean装配
为了演示Spring中对象是如何创建并放到spring容器中,这里新建一个maven项目: 其中pom.xm文件中只引入了一个依赖: <dependencies> <dependen ...
- Spring使用笔记(二)Bean装配
Bean装配 Spring提供了3种装配机制: 1)隐式的Bean发现机制和自动装配 2)在Java中进行显示装配 3)在XML中进行显示装配 一)自动化装配 1.指定某类为组件类: @Compone ...
- 使用Spring IoC进行Bean装配
Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...
- Spring Bean装配(下)——注解
@Repository,@Service,@Controller这三个注解是基于component定义的注解 component-scan:组件扫描 base-package:扫描这个下的所有类 &l ...
- 【Spring】Spring的bean装配
前言 bean是Spring最基础最核心的部分,Spring简化代码主要是依赖于bean,下面学习Spring中如何装配bean. 装配bean Spring在装配bean时非常灵活,其提供了三种方式 ...
- 使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”
使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”. 原 ...
- Spring中四种实例化bean的方式
本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式.上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把 ...
- Spring对Bean装配详解
1.Spring提供了三种装配bean的方式: 2.自动装配bean: 3.通过Java代码装配bean 4.通过XML装配bean 前言:创建对象的协作关系称为装配,也就是DI(依赖注入)的本质.而 ...
- Spring Bean装配学习
解释:所谓装配就是把一个类需要的组件给它设置进去,英文就是wire,wiring:注解Autowire也叫自动装配. 目前Spring提供了三种配置方案: 在XML中进行显式的配置 在Java中进行显 ...
随机推荐
- Selenium系列之--03【转】页面元素找不到问题的分析思路
如果在测试过程中遇到了NoSuchElementException 这个异常, 说明元素查找失败. Caused by: org.openqa.selenium.NoSuchElementExcept ...
- TestNg的工厂測试引用@DataProvider数据源----灵活使用工厂測试
之前说过@Factory更适合于同一类型的參数变化性的測试,那么假设參数值没有特定的规律时,我们能够採用@Factory和@DataProvider相结合的方式进行測试 注意要点:请注意測试方法将被一 ...
- the first week study
1.In 1989, a man named Guido create "python" as a kind of computer languages. And now we u ...
- encodeURIComponent
<script type="text/javascript"> function show(){ var f="#wer中文测试"; f = enc ...
- C++ 虚函数与纯虚函数 浅析
[摘要] 在虚函数与纯虚函数的学习中.要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异.掌握两者在实现上的必要性.熟悉纯虚函数在子类与孙类的函数类型.本文即针对上述问题展开阐述. ...
- UIwebView缩放
首先就是需要让webView去设置下可以支持缩放 [__webView setScalesPageToFit:YES]; 如果网页支持缩放只需要上面的一句就可以了.你可以加在谷歌的试一下,但是你要加在 ...
- Bean Query 第一个版本号(1.0.0)已公布
BeanQuery 是一个把对象转换为Map的Java工具库. 支持选择Bean中的一些属性.对结果进行排序和依照条件查询. 不只能够作用于顶层对象,也能够作用于子对象.很多其它具体的介绍能够看我的博 ...
- PS人物脸部去高光简单之法
案例素材图: 方法原理步骤:得到高光面的选区,然后吸取高光面附近的颜色填充上去,这样就达到了去高光的效果. 得到高光选区的方法有很多种,要提取这种选区,通过阿尔法通道是最合适不过的了,本案例就通过阿尔 ...
- ubuntu LNMP环境下安装Redis,以及php的redis扩展
1.下载 sudo wget http://download.redis.io/releases/redis-4.0.9.tar.gz 2.解压 sudo tar zvxf redis-4.0.9.t ...
- 演练:使用属性自定义 DataGrid 控件
演练:使用属性自定义 DataGrid 控件 Silverlight 此主题尚未评级 - 评价此主题 Silverlight DataGrid 控件支持常用表格式设置选项,例如交替显示不同的行 ...