Rev 20 | Rev 25 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | soliveira | 1 | package org.mentacontainer; |
2 | |||
3 | /** |
||
4 | * A very simple container that provides: |
||
5 | * <ul> |
||
6 | * <li> Bean instantiation (duh!)</li> |
||
7 | * <li> Constructor injection for bean setup</li> |
||
8 | * <li> Setter injection for bean setup</li> |
||
9 | * <li> Auto-wiring based on name and type</li> |
||
10 | * <li> Singleton</li> |
||
20 | soliveira | 11 | * <li> Wiring of external beans with the beans configured in this container</li> |
2 | soliveira | 12 | * </ul> |
13 | * |
||
14 | * It does not get much simpler than that. |
||
15 | * |
||
16 | * @author sergio.oliveira.jr@gmail.com |
||
17 | * |
||
18 | */ |
||
19 | public interface Container { |
||
20 | |||
21 | /** |
||
22 | * Get an instance from the container. |
||
23 | * |
||
24 | * The instance will be fully initialized (constructor and/or setters) and fully wired. |
||
25 | * |
||
26 | * @param key The key representing the bean to return. The name of the bean in the container. |
||
27 | * @return The fully initialized and wired bean. |
||
28 | */ |
||
29 | public Object get(String key); |
||
30 | |||
31 | /** |
||
32 | * Configure a bean to be returned with the given implementation when {@link #get(String)} is called. |
||
33 | * |
||
34 | * @param key The key representing the bean to return. The name of the bean in the container. |
||
35 | * @param klass The class used to instantiate the bean, in other words, its implementation. |
||
36 | * @param singleton A boolean to indicate if this bean will be a singleton. |
||
20 | soliveira | 37 | * @return The component created. (Fluent API) |
2 | soliveira | 38 | */ |
20 | soliveira | 39 | public Component ioc(String key, Class<? extends Object> klass, boolean singleton); |
2 | soliveira | 40 | |
41 | /** |
||
21 | soliveira | 42 | * Same as {@link #ioc(String, Class, boolean)} except that it assumes |
2 | soliveira | 43 | * singleton is false. |
44 | * |
||
45 | * @param key |
||
46 | * @param klass |
||
20 | soliveira | 47 | * @return The component created. (Fluent API) |
2 | soliveira | 48 | */ |
20 | soliveira | 49 | public Component ioc(String key, Class<?extends Object> klass); |
2 | soliveira | 50 | |
51 | /** |
||
20 | soliveira | 52 | * Set up IoC based on the component passed. |
2 | soliveira | 53 | * |
20 | soliveira | 54 | * @param component The component for the IoC. |
55 | * @return The component passed as a parameter. (Fluent API) |
||
21 | soliveira | 56 | * @see Component |
20 | soliveira | 57 | */ |
58 | public Component ioc(Component component); |
||
59 | |||
60 | /** |
||
61 | * Configure a bean dependency to be auto-wired by the container. In general you want the |
||
62 | * type of the dependency to be an interface, for loosely couple dependencies. It works like that:<br/><br/> |
||
63 | * |
||
2 | soliveira | 64 | * Whenever the container returns a bean, it checks to see if it has a property named <i>property</i> |
65 | * and if the type of the property is <i>klass</i>. If it does, then it looks for a bean named |
||
66 | * <i>source</i> and injects it inside the first bean it is returning. This approach is recursive |
||
67 | * so all properties are checked up the class hierarchy, until it reaches Object. |
||
68 | * |
||
69 | * @param property a bean property that will require another bean, in other words, the required |
||
70 | * bean will be injected in the property of the bean been requested from the container. (auto-wiring by name) |
||
20 | soliveira | 71 | * @param klass the type of the dependency, in other words, the type of the auto-wiring. (auto-wiring by type) |
2 | soliveira | 72 | * @param source The dependency itself, coming from the container as well, in other words, the bean that will be injected in the original bean |
73 | * @return The container itself. (Fluent API) |
||
74 | */ |
||
20 | soliveira | 75 | public Dependency autowire(String property, Class<? extends Object> klass, String source); |
2 | soliveira | 76 | |
77 | /** |
||
21 | soliveira | 78 | * Same as {@link #autowire(String, Class, String)} except that it assumes that the property name will be the source name, in other words, |
2 | soliveira | 79 | * the property name is the same as the bean name that will be injected as the dependency. |
80 | * |
||
81 | * @param property |
||
82 | * @param klass |
||
83 | * @return The container itself. (Fluent API) |
||
84 | */ |
||
20 | soliveira | 85 | public Dependency autowire(String property, Class<? extends Object> klass); |
2 | soliveira | 86 | |
87 | /** |
||
21 | soliveira | 88 | * Setup a dependency. |
2 | soliveira | 89 | * |
21 | soliveira | 90 | * @param dependency The dependency to setup |
91 | * @return The dependency itself. (Fluent API) |
||
92 | * @see Dependency |
||
2 | soliveira | 93 | */ |
20 | soliveira | 94 | public Dependency autowire(Dependency dependency); |
2 | soliveira | 95 | |
96 | /** |
||
97 | * Take a given bean and populate its properties with other beans coming from this container. Perhaps you can call this auto-wiring. |
||
98 | * You basically checking properties of the given bean and looking for values (by name and type!) inside the container. And injecting |
||
99 | * in the given bean, in other words, populating it. |
||
100 | * |
||
101 | * @param bean The bean to be populated with other beans from the container. |
||
102 | * @return The container itself. (Fluent API) |
||
103 | */ |
||
4 | soliveira | 104 | public Container populate(Object bean) throws Exception; |
105 | |||
106 | /** |
||
107 | * Check whether the container is configured to provide a bean with name 'key'. |
||
108 | * |
||
109 | * @param key The key representing the bean inside the container. |
||
110 | * @return true if the container contains this bean. |
||
111 | */ |
||
112 | public boolean contains(String key); |
||
2 | soliveira | 113 | } |