1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.guice;
17
18 import static com.google.inject.matcher.Matchers.annotatedWith;
19 import static com.google.inject.matcher.Matchers.any;
20 import static com.google.inject.matcher.Matchers.not;
21 import static com.google.inject.name.Names.named;
22 import static com.google.inject.util.Providers.guicify;
23 import static org.mybatis.guice.Preconditions.checkArgument;
24
25 import com.google.inject.AbstractModule;
26 import com.google.inject.Binder;
27 import com.google.inject.Scopes;
28 import com.google.inject.matcher.AbstractMatcher;
29
30 import java.lang.reflect.Method;
31 import java.util.Set;
32
33 import org.apache.ibatis.io.ResolverUtil;
34 import org.apache.ibatis.session.SqlSession;
35 import org.apache.ibatis.session.SqlSessionManager;
36 import org.mybatis.guice.mappers.MapperProvider;
37 import org.mybatis.guice.session.SqlSessionManagerProvider;
38 import org.mybatis.guice.transactional.Transactional;
39 import org.mybatis.guice.transactional.TransactionalMethodInterceptor;
40
41 abstract class AbstractMyBatisModule extends AbstractModule {
42
43 protected static final AbstractMatcher<Method> DECLARED_BY_OBJECT = new AbstractMatcher<Method>() {
44 @Override
45 public boolean matches(Method method) {
46 return method.getDeclaringClass() == Object.class;
47 }
48 };
49
50 protected static final AbstractMatcher<Method> SYNTHETIC = new AbstractMatcher<Method>() {
51 @Override
52 public boolean matches(Method method) {
53 return method.isSynthetic();
54 }
55 };
56
57 private ClassLoader resourcesClassLoader = getDefaultClassLoader();
58
59 private ClassLoader driverClassLoader = getDefaultClassLoader();
60
61
62
63
64
65
66
67
68
69 protected static Set<Class<?>> getClasses(String packageName) {
70 return AbstractMyBatisModule.getClasses(new ResolverUtil.IsA(Object.class), packageName);
71 }
72
73
74
75
76
77
78
79
80
81
82
83 protected static Set<Class<?>> getClasses(ResolverUtil.Test test, String packageName) {
84 checkArgument(test != null, "Parameter 'test' must not be null");
85 checkArgument(packageName != null, "Parameter 'packageName' must not be null");
86 return new ResolverUtil<Object>().find(test, packageName).getClasses();
87 }
88
89 @Override
90 protected final void configure() {
91 try {
92
93 bind(SqlSessionManager.class).toProvider(SqlSessionManagerProvider.class).in(Scopes.SINGLETON);
94 bind(SqlSession.class).to(SqlSessionManager.class).in(Scopes.SINGLETON);
95
96 internalConfigure();
97
98 bindTransactionInterceptors();
99
100 bind(ClassLoader.class).annotatedWith(named("JDBC.driverClassLoader")).toInstance(driverClassLoader);
101 } finally {
102 resourcesClassLoader = getDefaultClassLoader();
103 driverClassLoader = getDefaultClassLoader();
104 }
105 }
106
107
108
109
110 protected void bindTransactionInterceptors() {
111
112 TransactionalMethodInterceptor interceptor = new TransactionalMethodInterceptor();
113 requestInjection(interceptor);
114 bindInterceptor(any(), not(SYNTHETIC).and(not(DECLARED_BY_OBJECT)).and(annotatedWith(Transactional.class)),
115 interceptor);
116
117
118
119 bindInterceptor(annotatedWith(Transactional.class),
120 not(SYNTHETIC).and(not(DECLARED_BY_OBJECT)).and(not(annotatedWith(Transactional.class))), interceptor);
121 }
122
123
124
125
126
127
128
129
130
131 final <T> void bindMapper(Class<T> mapperType) {
132 bind(mapperType).toProvider(guicify(new MapperProvider<T>(mapperType))).in(Scopes.SINGLETON);
133 }
134
135
136
137
138
139
140
141
142
143 public void useResourceClassLoader(ClassLoader resourceClassLoader) {
144 this.resourcesClassLoader = resourceClassLoader;
145 }
146
147
148
149
150
151
152
153
154 protected final ClassLoader getResourceClassLoader() {
155 return resourcesClassLoader;
156 }
157
158
159
160
161
162
163
164
165
166 public void useJdbcDriverClassLoader(ClassLoader driverClassLoader) {
167 this.driverClassLoader = driverClassLoader;
168 }
169
170
171
172
173
174
175
176
177 private ClassLoader getDefaultClassLoader() {
178 return getClass().getClassLoader();
179 }
180
181
182
183
184 abstract void internalConfigure();
185
186
187
188
189 protected abstract void initialize();
190
191 }