Spring容器给我们提供了很好的环境,我们只关注主要业务即可,其他的无需关注太多。今天刚学的DI

DI(Dependency Injection):依赖注入

使用XML配置文件完成依赖注入

1.1普通属性的注入

创建实体类:

package cn.spring.entity;

import java.io.Serializable;

/**
* Created by accp on 2017/3/23.
*/
public class User implements Serializable {
private String name;
private String pwd;
private Integer age; //带参构造
public User(String name, String pwd, Integer age) {
this.name = name;
this.pwd = pwd;
this.age = age;
} public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
} public User(String name, Integer age) {
this.name = name;
this.age = age;
} public User() {
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", age=" + age +
'}';
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

编写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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!--属性注入-->
<bean id="user1" class="cn.spring.entity.User">
<property name="name" value="张三"></property>
<property name="age" value=""></property>
</bean> </beans>

测试类:

 @Test
/*属性注入*/
public void firstTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)ctx.getBean("user1");
System.out.println(user);
}

运行结果:

1.1.2域属性的注入

创建实体类

package cn.spring.entity;

import java.io.Serializable;

/**
* Created by accp on 2017/3/23.
*/
public class User implements Serializable {
private String name;
private String pwd;
private Integer age; private Car myCar; public User(String name, String pwd, Car myCar) {
this.name = name;
this.pwd = pwd;
this.myCar = myCar;
} public User(String name, String pwd, Integer age, Car myCar) {
this.name = name;
this.pwd = pwd;
this.age = age;
this.myCar = myCar;
} //带参构造
public User(String name, String pwd, Integer age) {
this.name = name;
this.pwd = pwd;
this.age = age;
} public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
} public User(String name, Integer age) {
this.name = name;
this.age = age;
} public User() {
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", age=" + age +
", myCar=" + myCar +
'}';
} public Car getMyCar() {
return myCar;
} public void setMyCar(Car myCar) {
this.myCar = myCar;
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
package cn.spring.entity;

/**
* Created by accp on 2017/3/23.
*/
public class Car {
private String color; public Car() {
} public Car(String color) {
this.color = color;
} @Override
public String toString() {
return "Car{" +
"color='" + color + '\'' +
'}';
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
}

编写xml文件

 <!--域属性注入-->
<bean id="mmCar" class="cn.spring.entity.Car">
<property name="color" value="green color"></property>
</bean> <bean id="user4" class="cn.spring.entity.User">
<property name="name" value="王小二"></property>
<property name="age" value=""></property>
<property name="myCar" ref="mmCar"></property>
</bean>

测试类

 @Test
/*域属性注入*/
public void fourTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)ctx.getBean("user4");
System.out.println(user);
}

运行结果:

1.2构造注入

这个示例还是借用上面创建的实体类,实体类的构造已创建完成,接下来就编写xml文件

xml文件

<!--构造注入-->
<bean id="user2" class="cn.spring.entity.User">
<constructor-arg index="" value="李四"></constructor-arg>
<constructor-arg index="" value=""></constructor-arg>
<!-- <constructor-arg index="" value=""></constructor-arg>-->
</bean>

编写测试类

 @Test
/*构造注入*/
public void secondTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)ctx.getBean("user2");
System.out.println(user);
}

运行结果

1.2.2构造注入域属性

注入域属性与普通属性注入域属性的方式是一致的,我们只需简单的更改代码即可。

xml文件编写

  <!--构造注入域属性-->
<bean id="mmCar1" class="cn.spring.entity.Car">
<property name="color" value="red color"></property>
</bean> <bean id="user5" class="cn.spring.entity.User">
<constructor-arg index="" value="小二"></constructor-arg>
<constructor-arg index="" value=""></constructor-arg>
<!-- <constructor-arg index="" value=""></constructor-arg>-->
<constructor-arg index="" ref="mmCar1"></constructor-arg>
</bean>

编写测试类

 @Test
/*构造注入域属性*/
public void fiveTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)ctx.getBean("user5");
System.out.println(user);
}

1.3使用p命名空间注入

使用p命名空间注入时,需要注意的是:需要引入

如上图所示的命名空间。

xml文件编写

<!--p空间注入 直接注入值 -->
<bean id="user3" class="cn.spring.entity.User" p:name="王五" p:age="" p:myCar="myCar"></bean><!-- p:myCar="red"-->

还有一种方式:

 <!--p空间注入 引用bean -->
<!--<bean id="user3" class="cn.spring.entity.User" p:name="王五" p:age="14" p:myCar-ref="mmCar" ></bean>-->

一共两种方式,都可以实现p命名空间的注入。

编写测试类

 @Test
/*p空间注入*/
public void thirdTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)ctx.getBean("user3");
System.out.println(user);
}

运行结果

1.4集合注入

集合注入分为:array  list  set map properties 注入

在这里我们就不举例array的示例了,简单的把其他的实例演示一下。

创建实体类

package cn.spring.entity;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; /**
* Created by accp on 2017/3/23.
*/
public class CollectionBean { /**
* 数组
* List
* Map
* Set
* properties
*
*/ private List<String> list; private Set<String> set; private Map<String,String> map; private Properties properties; public Properties getProperties() {
return properties;
} public void setProperties(Properties properties) {
this.properties = properties;
} public Map<String, String> getMap() {
return map;
} public void setMap(Map<String, String> map) {
this.map = map;
} public Set<String> getSet() {
return set;
} public void setSet(Set<String> set) {
this.set = set;
} public List<String> getList() {
return list;
} public void setList(List<String> list) {
this.list = list;
}
}

编写xml文件

    @Test
/*list集合注入*/
public void sexTest01(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean bean=(CollectionBean)ctx.getBean("collectionBean");
System.out.println(bean.getList()); } @Test
/*set集合注入*/
public void sexTest02(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); //set集合
CollectionBean bean=(CollectionBean)ctx.getBean("collectionBean2");
System.out.println(bean.getSet());
} @Test
/*map集合注入*/
public void sexTest03(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//map集合
CollectionBean bean=(CollectionBean)ctx.getBean("collectionBean3");
System.out.println(bean.getMap().values()); //value值
System.out.println(bean.getMap().keySet()); //key值
} @Test
/*properties 注入*/
public void setTest04(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean bean=(CollectionBean)ctx.getBean("properties");
System.out.println(bean.getProperties());
}

编写测试类

  @Test
/*list集合注入*/
public static void sexTest01(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean bean=(CollectionBean)ctx.getBean("collectionBean");
System.out.println(bean.getList()+"==========list"); } @Test
/*set集合注入*/
public static void sexTest02(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); //set集合
CollectionBean bean=(CollectionBean)ctx.getBean("collectionBean2");
System.out.println(bean.getSet()+"==========set");
} @Test
/*map集合注入*/
public static void sexTest03(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//map集合
CollectionBean bean=(CollectionBean)ctx.getBean("collectionBean3");
System.out.println(bean.getMap().values()+"==========map"); //value值
System.out.println(bean.getMap().keySet()); //key值
} @Test
/*properties 注入*/
public static void sexTest04(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean bean=(CollectionBean)ctx.getBean("properties");
System.out.println(bean.getProperties()+"==========properties");
}

运行结果

1.5使用注解的方式

使用注解方式实现值的注入需要导入命名空间

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">

以上的文件约束中的context为注解需要导入的命名空间。

在编写xml文件时只需要加入包扫描器即可。

xml文件编写

 <!--注解配置包扫描器-->
<context:component-scan base-package="cn.spring.note"></context:component-scan>

创建实体类

package cn.spring.note;

import cn.spring.entity.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; import javax.annotation.Resource; /**
* Created by accp on 2017/3/23.
*/
//Component :不分包
//Service: biz层
//Controller: action
//Repository: biz
@Component("person")
public class Person {
@Value("张三")
private String name;
@Value("")
private Integer age; @Autowired
@Qualifier("car")
private Car myCar; @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", myCar=" + myCar +
'}';
} public Person() {
} public Car getMyCar() {
return myCar;
} public void setMyCar(Car myCar) {
this.myCar = myCar;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

Car编写

package cn.spring.note;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; /**
* Created by accp on 2017/3/23.
*/
@Component("car")
@Scope("prototype")
/*@Scope("singleton")*/
public class Car { @Value("red")
private String color; @Override
public String toString() {
return "Car{" +
"color='" + color + '\'' +
'}';
} public Car() {
System.out.println("开始创建");
} public Car(String color) {
this.color = color;
}
}

编写测试类(自身属性注入)

 @Test
/*注解自身属性*/
public void sevenTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextXml.xml");
Person person=(Person) ctx.getBean("person");
System.out.println(person);
}

运行结果

编写测试类(关联属性注入)

@Test
/*注解关联对象*/
public void eightTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextXml.xml");
Person person=(Person) ctx.getBean("person");
System.out.println(person);
}

运行结果

1.5.1使用注解实现多例

package cn.spring.note;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; /**
* Created by accp on 2017/3/23.
*/
@Component("car")
@Scope("prototype")
/*@Scope("singleton")*/
public class Car { @Value("red")
private String color; @Override
public String toString() {
return "Car{" +
"color='" + color + '\'' +
'}';
} public Car() {
System.out.println("开始创建");
} public Car(String color) {
this.color = color;
}
}

编写测试类

 @Test
/*注解实现多例*/
public void nineTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextXml.xml");
Car car=(Car) ctx.getBean("car");
Car car2=(Car) ctx.getBean("car");
System.out.println(car);
System.out.println(car2);
}

1.5.2注解实现增强

创建实体类

package cn.spring.entity;

import java.io.Serializable;

/**
* Created by accp on 2017/3/23.
*/
public class User implements Serializable {
private String name;
private String pwd;
private Integer age; private Car myCar; public User(String name, String pwd, Car myCar) {
this.name = name;
this.pwd = pwd;
this.myCar = myCar;
} public User(String name, String pwd, Integer age, Car myCar) {
this.name = name;
this.pwd = pwd;
this.age = age;
this.myCar = myCar;
} //带参构造
public User(String name, String pwd, Integer age) {
this.name = name;
this.pwd = pwd;
this.age = age;
} public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
} public User(String name, Integer age) {
this.name = name;
this.age = age;
} public User() {
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", age=" + age +
", myCar=" + myCar +
'}';
} public Car getMyCar() {
return myCar;
} public void setMyCar(Car myCar) {
this.myCar = myCar;
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

Car类

package cn.spring.entity;

/**
* Created by accp on 2017/3/23.
*/
public class Car {
private String color; public Car() {
} public Car(String color) {
this.color = color;
} @Override
public String toString() {
return "Car{" +
"color='" + color + '\'' +
'}';
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
}

创建DAO

package cn.spring.dao;

import cn.spring.entity.User;

/**
* Created by accp on 2017/3/24.
*/
public interface UserDao {
public void save(User user);
}

创建DAOImpl

package cn.spring.dao.impl;

import cn.spring.dao.UserDao;
import cn.spring.entity.User; /**
* Created by accp on 2017/3/24.
*/
public class UserDaoImpl implements UserDao {
public void save(User user) {
System.out.println("开始保存用户");
}
}

创建Biz

package cn.spring.biz;

import cn.spring.entity.User;

/**
* Created by accp on 2017/3/24.
*/
public interface UserBiz {
public void save(User user);
}

创建BizImpl

package cn.spring.biz.impl;

import cn.spring.biz.UserBiz;
import cn.spring.dao.UserDao;
import cn.spring.entity.User; /**
* Created by accp on 2017/3/24.
*/
public class UserBizImpl implements UserBiz {
private UserDao dao;
public void save(User user) {
dao.save(user);
} public UserDao getDao() {
return dao;
} public void setDao(UserDao dao) {
this.dao = dao;
}
}

创建拦截类

package cn.spring.noteen;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; /**
* Created by accp on 2017/3/24.
* 注解增强
*/
@Aspect
public class UserBizLogger {
@Before("execution(* *..biz.*.*(..))")
public void before(){
System.out.println("注解方法增强开始");
}
@AfterReturning("execution(* *..biz.*.*(..))")
public void after(){
System.out.println("注解方法增强结束");
} }

xml配置文件

<!--注解方式的方法增强-->
<bean id="userDao" class="cn.spring.dao.impl.UserDaoImpl"></bean> <bean id="userBiz" class="cn.spring.biz.impl.UserBizImpl">
<property name="dao" ref="userDao"></property>
</bean>
<aop:aspectj-autoproxy/>
<bean class="cn.spring.noteen.UserBizLogger"/>

测试类

 @Test
/*使用注解方式定义方法增强*/
public void tenTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserBiz biz=(UserBiz)ctx.getBean("userBiz");
biz.save(new User());
}

运行结果

Spring 中使用XML配置方式和使用注解方式实现DI的更多相关文章

  1. 关于Spring中applicationContext.xml配置错误“org/springframework/transaction/interceptor/TransactionInterceptor”的问题解决

    问题描述: 在配置spring的applicationContext.xml中的默认事务管理器的时候可能会出现这样的错误: Error occured processing XML 'org/spri ...

  2. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

    接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...

  3. spring中的xml配置出处

  4. 在spring中使用quartz配置作业的二种方式

  5. web.xml中配置Spring中applicationContext.xml的方式

    2011-11-08 16:29 web.xml中配置Spring中applicationContext.xml的方式 使用web.xml方式加载Spring时,获取Spring applicatio ...

  6. Spring中三种配置Bean的方式

    Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...

  7. spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式

    spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...

  8. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  9. 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

    Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...

随机推荐

  1. 在centOS 7 中安装 MySQL

    知道来源:https://www.cnblogs.com/bigbrotherer/p/7241845.html 1 下载并安装MySQL官方的 Yum Repository [root@localh ...

  2. Git进行fork后如何与原仓库同步

    在进行Git协同开发的时候,往往会去fork一个仓库到自己的Git中,过一段时间以后,原仓库可能会有各种提交以及修改,很可惜,Git本身并没有自动进行同步的机制,这个需要手动去执行.name如何进行自 ...

  3. Redis偶发连接失败案例分析

    [作者] 张延俊:携程技术保障中心资深DBA,对数据库架构和疑难问题分析排查有浓厚的兴趣. 寿向晨:携程技术保障中心高级DBA,主要负责携程Redis及DB的运维工作,在自动化运维,流程化及监控排障等 ...

  4. 使用win10自带邮件应用发送文件

    之前的电脑装过邮件客户端,想发送文件给别人时,只需要“右键文件——发送到邮件”,就能把文件作为附件发送给对方.新电脑win10系统自带邮件客户端,所以就想直接用.但是右键发送到邮件没有关联上,用不了. ...

  5. centos安装 Anaconda3及使用

    下载安装 下载地址https://www.anaconda.com/download/ 旧版本下载https://repo.continuum.io/archive/ 比如下载Anaconda3-4. ...

  6. How to manage IntelliJ IDEA projects under Version Control Systems

    如何在版本控制系统中管理 IntelliJ IDEA 项目文件 IntelliJ IDEA 设置详细,功能强大.在实际工作中,我们有时会遇到跟同事共享项目文件的情况. 那么,有哪些项目文件应该加入到版 ...

  7. Ubuntu“无法打开锁文件(Could not get lock)”问题解决

    用apt-get安装软件时提示: 无法获得锁 /var/lib/dpkg/lock - open(11:资源暂时不可用) 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? 其 ...

  8. 用c语言实现三子棋

    1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ...

  9. 由一段代码谈前端js优化和编码规范(一) 分类: JavaScript 2015-03-21 12:43 668人阅读 评论(1) 收藏

    这段代码是撸主刚毕业那会写的,主要是实现一个左侧的导航条的折叠功能.当时实现的比较简陋,每次在导航条增加新的项目的时候,都要手动去修改js代码中写死的索引...确实是比较恼火的,后来就修改了一下,能够 ...

  10. 《LeetBook》leetcode题解(18) : 4Sum[M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...