Thứ Năm, 26 tháng 7, 2018

What is Spring Framework for?


You may hear a lot about Spring, people are saying all over the web that Spring is a good framework for web development

What exactly is Spring Framework for? How can you use it for Web application development? Here's the answer:


Basically Spring is a framework for dependency-injection which is a pattern that allows to build very decoupled systems.

The problem

For example, suppose you need to list the users of the system and thus declare an interface called UserLister:

public interface UserLister {
    List<User> getUsers();
}
And maybe an implementation accessing a database to get all the users:
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}
In your view you'll need to access an instance (just an example, remember):
public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

Note that the code above doesn't have initialized the variable userLister. What should we do? If we explicitly instantiate the object like this:

UserLister userLister = new UserListerDB();

...We'd couple the view with the implementation of the class that access the DB. What if we want to switch from the DB implementation to another that gets the user list from a comma-separated file (remember, it's an example)? In that case we would go to the code again and change the last line by:

UserLister userLister = new UserListerCommaSeparatedFile();

This has no problem with a small program like this but... What happens in a program that has hundreds of views and a similar number of business classes. The maintenance becomes a nightmare!

Spring (Dependency Injection) approach

What Spring does is to wire the classes up by using an XML file or annotations, this way all the objects are instantiated and initialized by Spring and injected in the right places (Servlets, Web Frameworks, Business classes, DAOs, etc, etc, etc...).

Going back to the example in Spring we just need to have a setter for the userLister field and have either an XML file like this:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

or more simply annotate the filed in our view class with @Inject:

@Inject
private UserLister userLister;

This way when the view is created it magically will have a UserLister ready to work.
List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

It is great! Isn't it?

  • What if you want to use another implementation of your UserLister interface? Just change the XML
  • What if don't have a UserLister implementation ready? Program a temporal mock implementation of UserLister and ease the development of the view
  • What if I don't want to use Spring anymore? Just don't use it! Your application isn't coupled to it. Inversion of Control states: "The application controls the framework, not the framework controls the application".
There are some other options for Dependency Injection around there, in a subjective view, what has made Spring so famous besides its simplicity, elegance and stability is that the guys of SpringSource have programmed many many POJOs that help to integrate Spring with many other common frameworks without being intrusive in your application. Also Spring has several good subprojects like Spring MVC, Spring WebFlow, Spring Security and again a loooong list of etceteras.

For further reading you can read Martin Fowler's article about Dependency Injection and Inversion of Control. After understanding the basics take a look to Spring Documentation, it might be one of the best Spring book ever.

(Source: https://stackoverflow.com/questions/1061717/what-exactly-is-spring-framework-for)

Không có nhận xét nào:

Đăng nhận xét

Lưu ý: Chỉ thành viên của blog này mới được đăng nhận xét.

Digital Transformation In Supply Chain Management

Digital transformation is a term that is thrown around a lot, and people have different ways to interpret what it means. Essentially, digita...