java bean配置注入依赖_Sping配置文件-Bean的依赖注入

1.Bean的依赖注入分析

Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。

每个基于应用程序的 java 都有几个对象,由这些对象一起工作来呈现出终端用户所看到的工作的应用程序。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能独立于其他 Java 类来增加这些类重用的可能性,并且在做单元测试时,测试独立于其他类的独立性。依赖注入(或有时称为布线)有助于把这些类粘合在一起,同时保持他们独立。

依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。

在编写程序时,通过控制反转,把对象的创建权交给了Spring,但是代码中不可能出现没有依赖的情况。IOC解耦只是降低了他们的依赖关系,但是不会消除。例如:业务层仍会调用持久层的方法。

那这种业务层和持久层的依赖关系,在使用Spring之后,就让Spring来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取了。我们只需要获取业务层的对象,从而最终操作Dao层的方法。

业务层调用Dao层

UserService要调UserDao,UserDao对象已经让Spring给我产生了

b3bf2030221fa875052026651ecab98f.png

3063d17b2ee3fb8b6d844ed3ae9c9bbe.png

7855b511d9f6df349613a2b3cf4207c9.png

UserController.java(相当于web层)

package com.company.demo;

import com.company.service.UserService;

import com.company.service.impl.UserServiceImpl;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserController {

public static void main(String[] args) {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserService userService1 = (UserService) applicationContext.getBean("userService");

userService1.save();

}

}

service层:

UserService.java(接口)

package com.company.service;

public interface UserService {

public void save();

}

UserServiceImpl.java

package com.company.service.impl;

import com.company.dao.UserDao;

import com.company.service.UserService;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceImpl implements UserService {

public void save() {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserDao userDao = (UserDao) applicationContext.getBean("userDao");

userDao.save();

}

}

dao层:

a8d78b267d34d3d9dd06b644d64923d2.png

UserDao.java

package com.company.dao;

public interface UserDao {

public void save();

}

UserDaoImpl.java

package com.company.dao.impl;

import com.company.dao.UserDao;

public class UserDaoImpl implements UserDao {

public UserDaoImpl() {

System.out.println("UserDaoImpl创建...");

}

public void init() {

System.out.println("初始化方法....");

}

public void destroy() {

System.out.println("销毁方法....");

}

public void save() {

System.out.println("save running...");

}

}

目前UserService实例和UserDao实例都存在于Spring实例中,当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合。

f01efe4fe1fd3273ee06b65de96dafb4.png

a3ee24ffb4711278145c39a330a0627d.png

因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UseService内部。即Service需要Dao的依赖注入。

fb1cd8b5a213f1019b26f1620e115a4e.png

2.怎么把将UserDao设置到UseService内部?

两种方式:

(1)set方法

84470ab133660df6e1595c4f9ce4c045.png

这样不用通过容器获得Dao了,而是通过set方法将Dao注给了Service。

设置之后,在配置文件中要告诉Spring容器把Dao注给Service。

37a82b7eba723b3a5c3714bc633c0172.png

再去执行web层的代码UserController.java

0be7848f500fd8172b94367e563ae22e.png

set方法注入的简化方法:

P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:

首先,引入P命名空间

5c4461d7fcd20df47630f53e26da851d.png

其次,需要修改注入方式

加属性,代替子标签

b135fa29d24c5b4f280eabf914d2172c.png

完整版的

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

(2)构造方法(有参构造)

UserServiceImpl.java

package com.company.service.impl;

import com.company.dao.UserDao;

import com.company.service.UserService;

public class UserServiceImpl implements UserService {

private UserDao userDao;

// public void setUserDao(UserDao userDao) {

// this.userDao = userDao;

// }

public UserServiceImpl(UserDao userDao) {

this.userDao = userDao;

}

public UserServiceImpl() {

}

public void save() {

userDao.save();

}

}

175910f0f35b1a2d6a8f04b1f0e40b79.png

3.Bean的依赖注入的数据类型

上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。

422a4f93dd353ba97c415f85d7d85069.png

aacd95d3bac05a745f576bc7cef1eef1.png

以下都是用set方法注入

(1)普通数据类型注入

49d2d1fa8931978cdc09f6887cbc740f.png

为什么不用ref,因为ref表示对象的引用,这里username,age都是普通的数据类型

UserDaoImpl.java

package com.company.dao.impl;

import com.company.dao.UserDao;

public class UserDaoImpl implements UserDao {

private String username;

private int age;

public void setUsername(String username) {

this.username = username;

}

public void setAge(int age) {

this.age = age;

}

public void save() {

System.out.println(username+"...."+age);

System.out.println("save running...");

}

}

运行UseCtroller

package com.company.demo;

import com.company.service.UserService;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserController {

public static void main(String[] args) {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserService userService1 = (UserService) applicationContext.getBean("userService");

userService1.save();

}

}

5dd27e2007f5b40628b28e597e3e347e.png

(2)集合数据类型注入

UserDaoImpl.java

package com.company.dao.impl;

import com.company.dao.UserDao;

import com.company.domain.User;

import java.util.List;

import java.util.Map;

import java.util.Properties;

public class UserDaoImpl implements UserDao {

private List stringList;

private Map userMap;

private Properties properties;

public void setStringList(List stringList) {

this.stringList = stringList;

}

public void setUserMap(Map userMap) {

this.userMap = userMap;

}

public void setProperties(Properties properties) {

this.properties = properties;

}

public void save() {

System.out.println(stringList);

System.out.println(userMap);

System.out.println(properties);

System.out.println("save running...");

}

}

User.java

package com.company.domain;

public class User {

private String name;

private String addr;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAddr() {

return addr;

}

public void setAddr(String addr) {

this.addr = addr;

}

@Override

public String toString() {

return "User{" + "name='" + name + '\'' + ", addr='" + addr + '\'' + '}';

}

}

1f67eabcf2bd7e37ad855fec6e0d7f1b.png

applicationContext.xml

aaa

bbb

ccc

ddd

ppp1

ppp2

ppp3

执行UserController

cbede8ca61edd667e2c234dc05706bf9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值