Spring IOC
它目前是一个JAVAEE平台下最重要的一个框架,它已经是一个技术生态,基于SPRING框架可以大大提高项目的开发效率,主要应用的技术有:IOC, AOP,DT, MVC, Security, OAuth, ...
Spring IOC
依赖注入,也叫控制反转
按需注入,当某个类中,需要另一个或多个对象时,而这一个或多个对象又被Spring 框架的容器所管理,那框架就可以帮助我们自动注入到目标对象中。
public class User {
private Integer id;
private String name;
private String password;
private String realName;
}
// 传统的做法
public class UserDemo {
public static void main(String[] args) {
//创建一个User
User u = new User();
// 设置属性值
u.setId(1);
u.setName("jack");
u.setPassword("123456");
u.setRealName("张三丰");
//
System.out.println(u);
}
}
//如果是采用spring框架,则:
//定义一个xml文件,来描述这个Bean
...
<beans>
<bean id="u" class="com.hcedu.entity.User">
<property name="id" value="1"/>
<propeprty name="name" value="jack"/>
...
</bean>
</beans>
//在你的代码中,读取配置文件
public class UserDemo {
public static void main(String[] args) {
//利用Spring框架的核心类,去加载 xml 文件
ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");
//获取一个Bean
User u = ac.getBean("u",User.class);
}
}
Spring框架的功能
它含盖了从视图层、控制层、业务层、持久层全方位的技术技持,视图和控制主要由 Spring MVC框架来辅助,而业务层主要由IOC, AOP,DT来辅助,持久层则有专门的接口和类来负责,如:spring对JDBC的支持,对mybatis的支持,还有对Hibernate以及JPA的支持。除此以外,它还提供了很多辅助性的功能,如:面向切面编程,拦截器、定时器、任务调度、安全、认证、授权、消息服务、邮件服务等等
以上这些都需要用到Spring框架提供的核心容器[Application Context]以及IOC。当然,Spring框架与测试框架的集成也是做得很好的,如:与junit和testng的集成
Spring IOC的核心API
IOC, Inverse of Control, 控制反转, 也叫 Dependency Injection [DI]
核心API:
-
ApplicationContext 接口
\- ClassPathXmlApplicationContext
\- AnnotationConfigApplicationContext
-
所涉及到的一些注解:
-
@Configuration 告诉Spring 框架, 这是一个注解配置类
-
@ComponentScan 告诉Spring框架,去哪些包下面扫描相关的组件[Component]
-
@Component 告诉Spring框架,此类是一个Bean
-
@Controller
-
@Service
-
@Repository
-
-
@Value 直接给属性赋值, 使用不多
-
@Autowired 自动注入,是根据类型去匹配
-
@Qualifier, 当@Autowired有二义性时,配合此注解使用,它可以指定bean的名字。
-
@Resource ,相当于 @Autowired+@Qualifier
-
@Import 导入另一个配置类
-
@PropertySource 导入一个属性文件 [.properties]
-
@ImportResource 导入另一个配置文件 [.xml]
-
@Bean 用来修饰方法的,是定义在 配置类中的方法
-
....
-
注解配置步骤
-
编写一个注解配置类,这个类名一般叫:
AppConfig
-
把需要被扫描成组件的类,打上
@Component
注解 -
利用Spring的核心API,去加载并解析注解配置类
ApplicationContext ac =
new AnnotationConfigApplicationContext(AppConfig.class);
//利用ac 去获取Bean
XXX x = ac.getBean("beanName", XXX.class);
//...