Circular Dependency Resolution in Spring
Understanding Circular Dependencies
Circular dependencies occur when two or more beans depend on each other, creating a dependency cycle. Spring handles this through a three-level caching mechanism.
Early AOP and Caching Mechanism
The earlySingletonObjects cache (second-level) stores partially constructed bean instances that have undergone AOP processing. The singletonFactory cache (third-level) contains ObjectFactory instances capable of creating bean proxies when needed.
@Lazy Annotation Resolution
The @Lazy annotation breaks circular dependencies by deferring bean initialization until actual usage, preventing instantiation cycles during application context startup.
Spring-MyBatis Integration Architecture
Phase 1: Basic Configuration Setup
Project Structure and Dependencies
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
MyBatis Configuration
<configuration>
<environments default="development">
<environment id="development">
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
</dataSource>
</environment>
</environments>
</configuration>
Service Layer Implementation
@Service
public class UserServiceImpl {
@Autowired
private UserMapper userMapper;
public void executeQuery() {
System.out.println(userMapper.selectData());
}
}
Mapper Interface Definition
public interface UserMapper {
@Select("SELECT 'sample_data'")
String selectData();
}
Custom FactoryBean Implementation
@Component
public class MapperFactoryBean implements FactoryBean<Object> {
public Object getObject() throws Exception {
return Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class[]{UserMapper.class},
(proxy, method, args) -> {
System.out.println("Executing: " + method.getName());
return null;
}
);
}
public Class<?> getObjectType() {
return UserMapper.class;
}
}
Phase 2: MyBatis Proxy Integration
Enhanced FactoryBean with SqlSession
@Component
public class EnhancedMapperFactory implements FactoryBean<Object> {
private SqlSession sqlSession;
@Autowired
public void configureSession(SqlSessionFactory sessionFactory) {
sessionFactory.getConfiguration().addMapper(UserMapper.class);
this.sqlSession = sessionFactory.openSession();
}
public Object getObject() throws Exception {
return sqlSession.getMapper(UserMapper.class);
}
public Class<?> getObjectType() {
return UserMapper.class;
}
}
Application Configuration
@Configuration
@ComponentScan("com.example")
public class AppConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() throws IOException {
InputStream configStream = Resources.getResourceAsStream("mybatis-config.xml");
return new SqlSessionFactoryBuilder().build(configStream);
}
}
Database Driver Dependency
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
Testing the Integration
public class IntegrationTest {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
UserServiceImpl service = context.getBean(UserServiceImpl.class);
service.executeQuery();
}
}
Tomcat Architecture Overview
Core Components and Request Procesing
Tomcat's architecture consists of Connector components handling network communication and Container components managing Servlet lifecycle. The request processing pipeline involves protocol hendlers, adapters, and multiple container levels (Engine, Host, Context, Wrapper).
JSP Compilation Process
Jasper engine compiles JSP files into Servlet classes during runtime. The compilation involves parsing JSP syntax, generating Java source code, and compiling to bytecode. Pre-compilation options are available for performance optimization.
Server Configuration Elements
Key configuraton files include server.xml for core server settings, web.xml for application deployment descriptors, and context.xml for context-specific configurations. Connector configurations support various I/O models and protocols including HTTP/1.1, AJP, and HTTP/2.