目录
第1关:创建博客系统中的对象
参考代码
第2关:Spring 框架创建对象
参考代码
任务描述
本关任务:创建“博客系统”中的对象。
编程要求
在开始学习 Spring 框架之前我们先使用我们熟悉的方式(new
对象的方式创建java
对象)来创建“博客系统”中的所需对象并调用他们的方法,具体要求如下:
三个实体类(用户User
、博客Blog
、评论Comment
)已经创建完成,并且有相应方法,可在右侧文件夹中查看。
在服务类Service
中,集成了一些功能,需要你根据提示完成该类中的四个方法,在方法中创建对象并调用对象的相应方法。
最后在客户端(Task类
)中调用服务类的方法,首先注册,再登录,然后创建博客和发布评论。
完成任务后我们思考一下,使用 Java 的原生方法创建对象会出现什么问题?如果我们要更换博客类型( MarkDownBlog )又该如何修改代码?
测试说明
平台会对你编写的代码进行测试:
预期输出:
用户注册
用户登录
创建博客
发布评论
Service.java
package com.educoder.step1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.educoder.bean.Blog;
import com.educoder.bean.Comment;
import com.educoder.bean.User;
public class Service {
/********** Begin **********/
public void login() {
// TODO 创建 user对象 调用登录方法
User user = new User();
user.login();
}
public void register() {
// TODO 创建 user对象,调用注册方法
User user = new User();
user.register();
}
public void createBlog() {
// TODO 创建博客对象,调用创建博客方法
Blog blog = new Blog();
blog.createBlog();
}
public void createComment() {
// TODO 创建评论对象,调用创建评论方法
Comment comment = new Comment();
comment.createComment();
}
/********** End **********/
}
Task.java
package com.educoder.step1;
import com.educoder.bean.User;
import com.educoder.bean.Blog;
import com.educoder.bean.Comment;
public class Task {
public static void main(String[] args) {
/********** Begin **********/
Service service = new Service();
service.register();
service.login();
service.createBlog();
service.createComment();
/********** End **********/
}
}
任务描述
本关任务:使用 Spring 框架来创建“博客系统”中的对象。
相关知识
我们使用了传统的方式创建对象,本章节我们就来学习如何使用 Spring 创建对象.
使用Spring 的方式创建对象
在上一章节中我们思考了一些问题,那么相信同学们也都想到了直接使用 Java 原生方法创建对象时存在的一些问题:
每次都需要自己主动创建并销毁对象
更换博客类型的代价巨大(需要将服务类中的所有原博客对象都替换为MarkDownBlog 博客对象,代码的改动量非常大)
这说明我们编写的程序具有“高耦合性”,面对这类问题我们就可以通过 Spring 来进行改进。
首先,我们在Service
类中定义好需要的类属性和方法:
public class Service {
private User user;
private Blog blog;
private Comment comment;
public void login() {}
public void register(){}
public void createBlog() {}
public void createComment(){}
}
现在和上一章节中一样,同样需要在方法里面调用类的方法。那我们使用 Spring 要怎么去实现呢?
我们只需要在Service
类上加上一个@Component
注解,在Service
类属性上面添加@Autowired
注解,最后在需要创建的相应对象上也添加@Component
注解,就可以了。
下面我们以Blog
类为例:
@Component //把对象注册到Spring容器中
public class Service {
@Autowired
private Blog blog;
public void createBlog(){
blog.createBlog();
}
}
@Component
public class Blog {
public void createBlog() {System.out.println("创建博客");}
}
最后我们在客户端调用Service
中的方法:
public class Task {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过Spring容器获取Service对象
Service service = (Service) app.getBean("service");
//调用方法
service.createBlog();
}
}
这样就完成了使用 Spring 框架来实现相同的功能。并且在这个过程中,我们没有使用new
关键字来创建对象。那么这个工作由谁去实现了呢?
实际上是由Spring 容器来帮我们做了这个事情。(后续我们进一步了解)
然后我们再看看Service
的createBlog()
方法中也没有对象的创建,也就是说这个创建对象的过程和结束已经不需要我们来进行管理了,通通由 Spring 来管理。
回到更换博客类型上,这时,我们只需要修改Service
中的对象就可以了:
@Component
public class Service {
@Autowired
private MarkDownBlog blog; //MarkDownBlog 类上也添加了@Component注解
//private Blog blog;
public void createBlog(){
blog.createBlog();
}
}
或者,如果你不想修改对象,也是可以的,但是需要你另外创建一个接口,让 Blog 和 MarkDownBlog 同时实现该接口,这样你使用任意对象都可以。
编程要求
在右侧编辑器补充代码,使用 Spring 框架的方式来完成上一关卡的相同任务。
在Service
类中补充相应注解,并在相应方法中调用对象的方法。
在Task
类中完成对服务类的方法调用,顺序仍为注册、登录、创建博客和发布评论。
测试说明
平台会对你编写的代码进行测试:
预期输出:
用户注册
用户登录
创建博客
发布评论
Service.java
package com.educoder.step2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.educoder.bean.Blog;
import com.educoder.bean.Comment;
import com.educoder.bean.User;
/********** Begin **********/
@Component
public class Service {
@Autowired
private User user;
@Autowired
private Blog blog;
@Autowired
private Comment comment;
public void login() {
user.login();
}
public void register() {
user.register();
}
public void createBlog() {
blog.createBlog();
}
public void createComment() {
comment.createComment();
}
}
/********** End **********/
Task.java
package com.educoder.step2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.educoder.bean.User;
public class Task {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过Spring容器获取Service对象
Service service = (Service) app.getBean("service");
/********** Begin **********/
service.register();
service.login();
service.createBlog();
service.createComment();
/********** End **********/
}
}