Spring依赖注入问题
记录一下最近复习的Spirng依赖注入问题
主要介绍两个注入方式 也是用的最多的 1.构造方法注入 2.Setter注入。
参考文档:https://blog.csdn.net/weixin_55418082/article/details/124466712
1.构造方法注入
原理:使用构造方法注入指的时Spring容器调用构造方法注入被依赖的实例(对象),构造方法可以是有参的或者是无参的。当spring读取配置信息后,会通过反射的方式调用实例的构造方法。如果是有参数构造方法,可以在构造方法中注入所需的参数值,最后创建类对象。
具体代码
实体类:
public class User { private String id; private String name; private String password; //添加有参构造方法 public User(String id, String name, String password) { this.id = id; this.name = name; this.password = password; //用于判段spring是否使用此方法 System.out.println("通过有参构造方法进行注入"); } //添加toString() @Override public String toString() { return "User{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
配置文件进行有参构造注入属性:
<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"> <!--创建一个User类的Bean实例--> <bean id="user1" class="com.DI.User"> <!--进行有参构造赋值--> <constructor-arg name="id" value="1"/> <constructor-arg name="name" value="张三"/> <constructor-arg name="password" value="123"/> </bean> </beans>
其中
测试类
public class userConstrtTest { public static void main(String[] args) { //加载配置文件,并且创建该实例 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml"); //获取创建的对象实例 User user = applicationContext.getBean("user1",User.class); //输出对象值 System.out.println(user); } }
输出:
2.Setter方法注入
Setter方法注入是当今Spring最主流的注入方法,你可以再各种SSM项目中见到它的身影
具体代码实现:
首先是一个实体类
public class User2 { private String id; private String name; private String password; public void setId(String id) { this.id = id; //依旧进行打印跟踪 System.out.println("set方法注入id属性"); } public void setName(String name) { this.name = name; System.out.println("set方法注入name属性"); } public void setPassword(String password) { this.password = password; System.out.println("set方法注入password属性"); } @Override public String toString() { return "User2{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
配置文件创建对应的bean实例:
<?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"> <!--创建一个user bean实例--> <bean id="user2" class="com.DI.User2"> <!--进行setter方法赋值操作--> <property name="id" value="2"></property> <property name="name" value="李明"></property> <property name="password" value="456"></property> </bean> </beans>
从代码中我们可以知道,当我们在使用setter方法进行诸如操作的时候,我们使用的是
测试类:
public class TestUser2 { public static void main(String[] args) { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean2.xml"); //获取bean创建的对象 User2 user2 = applicationContext.getBean("user2", User2.class); System.out.println(user2); } }
输出:
成功创建对象实例!.并且通过我设定的路径跟踪信息可以知道这是通过setter方法进行注入操作的
Setter方法注入对象的实际应用操作
//创建一个业务逻辑接口 public interface UserDao { //定义一个方法用于模拟登录功能的实现 public boolean login(String name,String password); }
创建该接口的实现类:
import com.DI.dao.UserDao; //创建一个业务逻辑接口 public class UserDaoImpl implements UserDao { public boolean login(String name, String password) { //如果名字是比尔和密码是123456就返回true if(name.equals("比尔")&&password.equals("12345")){ return true; } return false; } }
接下来编写服务层接口,userService
//服务层 public interface UserService { //创建服务层的登录方法 public boolean login(String name,String password); }
userService的实现类:
import com.DI.Service.UserService; import com.DI.dao.UserDao; //创建userservice的实现类 public class UserServiceImpl implements UserService { //创建一个UserDao类型的类变量 UserDao userDao; //添加setter方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; } //重写userService接口中的方法 public boolean login(String name, String password) { return userDao.login(name,password); } }
创建spring配置文件创建bean实例:
<?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"> <!--创建一个userDao的实例, <!--因为接口不能够实例化建对象,所以只能找他的子类建对象-->--> <bean id="userDaoImpl" class="com.DI.dao.Impl.UserDaoImpl"></bean> <!--创建一个UserService实例并将userdao注入到userservice当中--> <bean id="userService" class="com.DI.Service.Impl.UserServiceImpl"> <property name="userDao" ref="userDaoImpl"></property> </bean> </beans>
由上述代码可知,我们先创建userDao接口实现类的bean,然后通过
对于
name属性值:类里面属性名称
ref属性:创建userDao对象bean标签id值
最后建立一个测试类进行测试操作
import com.DI.Service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class userTYest { public static void main(String[] args) { ApplicationContext applicationContext= new ClassPathXmlApplicationContext("beanUser.xml"); UserService userService =(UserService)applicationContext.getBean( "userService"); boolean flag = userService.login("比尔","12345"); if(flag){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } } }
在这里我们的userService接口用器实现类创建的对象调用login方法进而调用userDao登录逻辑代码进行登录功能的实现,在这可以发现其中的妙处,不仅实现了简化代码还能够最大限度的解耦操作!
本文作者:JayZzzWh
本文链接:https://www.cnblogs.com/JayZzzWh/p/16825977.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步