Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的开源容器框架,用来解决企业项目开发中的复杂问题
目录
2.在pom.xml中引入Spring依赖包,并点击同步按钮
3.在main包下新建一个包resources --> 在resources文件夹下新建xml文件,选择Spring Config,起名为applicationContext
5.把创建的类名写到配置文件(xml/properties)中,在applicationContext.xml中敲入代码并指定类名,注意要加上包名,再给它的对象起个名
6.完成后我们在APP.java中进行调用,也就是从配置文件中读类的名字
7.接着我们开始在APP.java取对象,并打印输出,点击运行,这时我们不要再用Tomcat启动了,直接点击旁边的运行按钮即可,就可以看到数据库里的数据
1.我们只要在applicationContext.xml中修改类名即可
2.我们运行看看,得到数据库里另一表的数据,这样就真正做到了开闭原则,不修改App任何代码进行查询数据库的切换
1.创建service文件夹,并在service文件夹下创建UserService类,在其中写入代码
2.修改APP.java代码,用UserService来输出
3.但可以有更好的方法,和前面一样利用里氏替换原则,在applicationContext.xml增加一个service节点
4.接下来修改UserService代码,不用new方法,我们给它创建方法
5.修改APP.java代码, 用set方法对userService变量赋值,点击运行,没有问题,但是他们之间还是存在耦合性,
1.在org.examole文件夹下新建包pojo,并创建一个实体类Person
2.声明两个成员变量age和name,并且给他们增加Getter and Setter方法
2.在applicationContext.xml中增加一行代码使注解生效
3.我们也可以给它们赋值,在Person类中增加一个注解@Value,注意:注解只能管到离它最近的那行代码
4.其他的类也一样可以加入注解,注意:有四个注解它们功能一模一样,只是为了区分而已。
一、开闭原则
1.我们不能修改已有的类,我们想要切换不同的类,那么我们就需要新建一个新的实现类UserDaoImpl1,在UserDaoImpl1中我们可以从不同表获取值
2.我们要切换到UserDaoImpl1这个实现类,就只要修改MyServlet一行代码即可,其他均无需修改,这也就符合开闭原则,软件的扩展性也越强
二、不修改MyServlet任何代码的方法
1.把创建的类名写到配置文件(xml/properties)中
2.从配置文件中读类的名字
3.代码动态的把读到的类名的对象创建出来->反射
三、第一个Spring程序->控制反转(IOC)
IOC功能
1.开闭原则,不修改MyServlet任何代码
2.把创建的类名写到配置文件(xml/properties)中
3.从配置文件中读类的名字
4.代码动态的把读到的类名的对象创建出来->反射 JavaEE设计模式
5.Spring->IOC(控制反转)->解耦控制反转:在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。
1.新建一个模块
org.apache.maven.archetypes:maven-archetype-quickstart: 专属IOC功能
2.在pom.xml中引入Spring依赖包,并点击同步按钮
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
3.在main包下新建一个包resources --> 在resources文件夹下新建xml文件,选择Spring Config,起名为applicationContext
4.把上次javaweb中的dao复制到spring中来
5.把创建的类名写到配置文件(xml/properties)中,在applicationContext.xml中敲入代码并指定类名,注意要加上包名,再给它的对象起个名
6.完成后我们在APP.java中进行调用,也就是从配置文件中读类的名字
7.接着我们开始在APP.java取对象,并打印输出,点击运行,这时我们不要再用Tomcat启动了,直接点击旁边的运行按钮即可,就可以看到数据库里的数据
四、实现开闭原则
也就是不修改App任何代码进行查询数据库的切换,怎么做呢?
1.我们只要在applicationContext.xml中修改类名即可
2.我们运行看看,得到数据库里另一表的数据,这样就真正做到了开闭原则,不修改App任何代码进行查询数据库的切换
(userDaoImpl中为testName1,userDaoImpl1中为testName2,这里为2)
3.接着在APP.java中引用两个类,并做比较,结果为False. 原因:在java中,我们引用一个对象,就会创建一个堆空间,并且有一个栈空间指向它,当我们又引用一个对象时,它会创建一个新的堆空间,又有一个新的栈空间指向它,而比较的是内存地址,而这两者是不一样的
4.现在用里氏替换原则再来比较一下,为ture.原因:用里氏替换原则运行代码后,它会创建一个Spring容器,里面存放的就是我们要取的数据库,当两个对象分别去取的时候,其实他们取的是同一个,所以他们是一样的
因此,我们更倾向于用里氏替换原则,它可以节省内存,也叫单利模式(singleton)
五、依赖注入
1.创建service文件夹,并在service文件夹下创建UserService类,在其中写入代码
2.修改APP.java代码,用UserService来输出
//用UserService来输出
UserService userService=new UserService();
System.out.println(userService.findUser());
运行输出没问题
3.但可以有更好的方法,和前面一样利用里氏替换原则,在applicationContext.xml增加一个service节点
<bean class="org.example.service.UserService" id="userService">
</bean>
修改添加APP.java代码
//利用里氏替换原则-->用UserService来输出
UserService userService=(UserService) applicationContext.getBean("userService");
System.out.println(userService.findUser());
运行结果一样,但是实现了解耦,更方便
4.接下来修改UserService代码,不用new方法,我们给它创建方法
5.修改APP.java代码, 用set方法对userService变量赋值,点击运行,没有问题,但是他们之间还是存在耦合性,
为此,我们使用依赖注入(DI),用Spring容器来决定
依赖注入(DI):从Spring容器角度来看,Spring容器负责将被依赖的对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。
在applicationContext.xml中增加一行代码,修改APP.java代码,将 userService.setUserDao(userDao);注释掉,运行正确
六、Spring 基本类型String依赖注入
1.在org.examole文件夹下新建包pojo,并创建一个实体类Person
2.声明两个成员变量age和name,并且给他们增加Getter and Setter方法
七、spring容器注解
1.上面教大家任何解决耦合性,但是发现代码好像并没有减少,现在教大家方法既实现解耦又不用很多代码,applicationContext.xml中节点的代码全都可以删掉哦,我们只用一行代码就可以代替它们,一听就很方便吧
2.在applicationContext.xml中增加一行代码使注解生效
3.我们也可以给它们赋值,在Person类中增加一个注解@Value,注意:注解只能管到离它最近的那行代码
运行:
4.其他的类也一样可以加入注解,注意:有四个注解它们功能一模一样,只是为了区分而已。
@Component->其他层
@Service->Service层
@Repository->dao层
@Controller->Controller层
我们不能在接口UserDao上加注解,只能加在它的实现类UserDaoImpl上
在它上面加上 @Autowired注解,它可以实现自动注入
//在它上面加上 @Autowired注解,它可以实现自动注入 // Autowired 自动注入 // Autowired 替换set和get方法
同样可以运行成功
上课内容总结 及 参考实践该博客: