(四)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中进行显 ...
随机推荐
- C语言的结构体和 C++结构体的区别
C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不 ...
- python 【第三篇】函数基础
深浅拷贝 set是一个无序且不重复的元素集合访问速度快天生解决重复问题 #!/usr/bin/env python3 # -*- coding:utf-8 -*- #深浅拷贝 import copy ...
- web前端开发 代码规范 及注意事项
web前端开发 代码规范 及注意事项 外部命名规范 html .js .css文件名称命名规范 my_script.js my_camel_case_name.css my_index.html 路径 ...
- CSS的两个class选择器紧挨在一起
有一段HTML代码: <a class="glyphicons white no-js cogwheel" href="#" target="_ ...
- 【bzoj1965】[Ahoi2005]SHUFFLE 洗牌
x*2^m==l (mod n+1)x=(n/2+1)^m*l mod n+1 #include<algorithm> #include<iostream> #include& ...
- 请说出作用域public,private,protected,以及不写时的区别
这四个作用域的可见范围如下表所示. 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly. 作用域 当前类 同一package 子孙类 其他package public ...
- Class.forName() 详解
主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...
- Lightoj 1003 - Drunk(拓扑排序)
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
- nginx性能优化技巧
前几天买了本高俊峰的<高性能Linux服务器构建实战I>,网上都说运维必备手册,昨天看了目录加小50页感觉还是比较扩充视野的,很多东西在学校是不可能学到的,就是感觉有的地方讲的仍然不是很清 ...
- hdu-4118 Holiday's Accommodation(树形dp+树的重心)
题目链接: Holiday's Accommodation Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 200000/200000 ...