如何在spring框架中发生松散和紧密的耦合?

时间:2017-09-19 07:32:25

标签: java spring-mvc spring-boot loose-coupling tightly-coupled-code

抱歉,我再次问这个问题。已经足够解释了。即使我阅读了很多文章,也阅读了Rod johnson的文章。找不到松散和紧密耦合的地方。我一直试图了解这些组件是如何独立的?他们如何互动?粘贴了控制器,服务,dao,repo,model的代码。请解释一下。

控制器:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController("/user")
public class UserController {

    @Autowired
    ServiceInterface service;

    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public User save(@RequestBody User user) {
        return service.save(user);
    }

}

服务接口:

package com.example.demo;

public interface ServiceInterface {
    public User save(User user);
}

服务:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService implements ServiceInterface{

    @Autowired DaoInterface dao;

    public User save(User user) {
        return dao.save(user);
    }

}

Dao界面:

package com.example.demo;

    public interface DaoInterface {
        public User save(User user);
    }

道:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserDao implements DaoInterface{

    @Autowired UserRepo repo;
    public User save(User user) {
        return repo.save(user);
    }
}

回购:

package com.example.demo;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserRepo extends MongoRepository<User, String>{

}

型号:

package com.example.demo;

public class User {

    private String firstname;
    private String lastname;

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

}

1 个答案:

答案 0 :(得分:0)

松散耦合的实践伴随着编码到接口而不是实现。这意味着需要有UserServiceUserDao的界面和DefaultUserServiceDefaultUserDao以及DefaultUserService中的实现必须使用UserDao接口和在UserController中必须使用UserService界面。

但是有些开发人员反驳说,只有当同一个接口有两个实现时,我们才必须编写一个接口。例如:

UserDao接口和DatabaseUserDao实施和FileUserDao实施,其中两个实施都实施UserDao

从上面的示例中可以看出,如果我们使用UserDao接口,我们的代码将会松散耦合,并且可以轻松地在DatabaseUserDaoFileUserDao实现之间切换。

<强>更新

如果您使用

,现在就引入ServiceInterface
@Autowired
ServiceInterface service; 
您的UserController中的

表示Controller和UserService通过接口松散耦合。