2022.6.23
基本知识学习
最近在学习Spring框架,现在在学习依赖这一部分,学习这里的时候主要讲的是等待框架将持久层的内容移入业务层,这样我们在使用的时候就只用调用业务层就可以了!
本次主要记录对象属性的注入!
那么在学习这里的时候网上课程老师的讲解案例如下:
创建一个UserDao接口,一个UserService接口(前者是持久层,后者是业务层)
UserDaoImpl继承UserDao接口并重写UserDao接口中的save方法
UserServiceImpl继承UserService接口并重写其中的save方法
那么怎么实现将持久层的数据封装在业务层里面,具体过程可以见下面的图
这里使用的是构造的方式
详细代码如下:
1. UserDao接口
Interface UserDao{
public void save(){};
}
2. UserService接口
Interface UserService{
public void save(){};
}
3. UserDaoImpl类
public class UserDaoImpl implements UserDao{
private String username; //username 变量
private int age; //age变量
//设置 username 的值
public void setUsername(String username) {
this.username = username;
}
//set方法设置 age 的值
public void setAge(int age) {
this.age = age;
}
public void setUsername(String username, int age){
this.username=username;
this.age=age;
}
public UserDaoImpl() {
System.out.println("UserImpl创建....");
}
@Override
/*对接口UserDao的实现*/
public void save() {
System.out.println(username+"======"+age);
System.out.println("save running.....");
}
}
4. UserServiceImpl类
public class UserServiceImpl implements UserService {
private UserDao userDao;
//设置实例的时候的两种方法,set和使用有参构造!
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl() {
}
/*public void setUserDao(UserDao userDao){
this.userDao=userDao;
}*/
public void save() {
userDao.save();
System.out.println("running.....");
}
}
5. applicationContext.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean标签-->
<!-- <bean id="userDao" class="com.wxy.dao.impl.UserDaoImpl" ></bean>-->
<!-- <bean id="userDao" class="com.wxy.factory.StaticFactory" factory-method="getUserDao" ></bean>-->
<!-- <bean id="factory" class="com.wxy.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>-->
<bean id="userDao" class="com.wxy.dao.impl.UserDaoImpl" >
<property name="username" value="zhangsan"></property>
<property name="age" value="8"></property>
</bean>
<!-- <bean id="userService" class="com.wxy.service.impl.UserServiceImpl" >
<!–这里的name指的是你的方法的属性的名字,也就是这里的setUserDao中的除了set的名字,即为userDao(首字母要变成小写字母)–>
<!–此处的ref就是你要配置的东西,就是这里的userDao(来源于上面的<bean id="userDao" class="com.wxy.dao.impl.UserDaoImpl" >)–>
<property name="userDao" ref="userDao"></property>
</bean>-->
<!--<bean id="userService" class="com.wxy.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>-->
<bean id="userService" class="com.wxy.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
</beans>
6. UserControll类---对UserService的实现
public class UserControll {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService= (UserService) app.getBean("userService");//注意名字一定要写对
userService.save();
}
}
使用上面就可以成功的实现将持久层的数据封装到业务层里面,但是如果使用下面的代码就会出错,这个也是我这篇文章中我自己重点想要记录的!
// 如果是下面的代码是不行的
/*UserService userService=new UserServiceImpl();
userService.save();*/
// 会出现空指针异常,因为userDao是配置在Spring容器中的,但是你这里新创建的对象是调用不了容器里面的东西的!
关于上面的数据为什么会出现空指针异常,我们创建了UserServiceImpl类的对象,然后我们使用userService这个对象调用的时候,从“4. UserServiceImpl类” 中我们可看到就会调用userDao.save();这里存在一个问题就是我们自己创建对象的时候是没有创建userDao对象的,没有给他赋值就会导致他是空的,所以会出现空指针异常;
换种方式描述,我们来分析使用Spring容器的时候的过程:
具体的查找过程就像上面那样,那么就可以正常找到userDao的值,但是如果我们自己创建的话就会出现userDao为空,那么空再指向其他的方法或者属性就会出现空指针异常的情况!
好了,晚点再记录
=========================================================================继续记录了
使用set注入的过程还可以使用下面的方法 ----- p标签
首先找到命名空间 (application.context)
然后就可以添加的方式进行P标签的添加实现set的注入
力扣打卡
今天打卡的力扣是求回文字
对于回文字我想到了两种解法
解法一:通过比较第一个与最后一个,第二个与倒数第二个这样的方式来进行
解法二:通过将数字进行反转然后再与之前的数字进行比较,相同就证明是回文字
class Solution {
public boolean isPalindrome(int x) {
//解法一:
//基本思路,可以先获取输入的字符串的长度,然后需要是回文数的话就是(假设长度为n),1对应n--2对应n-1....
//我们需要首先将整型转换为字符型,然后通过charAt来读取数据并比较!使用等号比较就可以,使用equals比较的就是地址了
String num=Integer.toString(x);
int xLen=num.length();
for(int i=0;i<xLen/2;i++){
if(num.charAt(i)!=num.charAt(xLen-1-i))
{
return false;
}
}
return true;
//解法二:
//在参考了别人的答案之后就有了一种新的解法
//可以将你要比较的数据反过来,也就是反转,反转之后如果和之前的数据是一样的就说明是回文数
/* if(x<0){
return false; //x不存在的时候就返回错误
}
int cur=0;
int num=x; //需要一个新数据去接收就是为了让后面还有一个参考对象
while(num>0){
cur=cur*10+num%10;
num/=10;
}
return cur==x;
*/
}
}
=========================================================================
今天就记录到这里,明天继续!
每天都要开心哈,日常分享好看的照片再加上每日英文分享
Enjoy silence and nature surroundings and heal yourself through menditation.
<享受宁静和自然环境,通过沉思来治愈自己>