Spring两大核心:基于工厂模式IOC(DI)和基于动态代理AOP。
其中IOC(DI)是指控制器反转(依赖注入),原来要使用某个类对象实例是必须自己创建,使用spring后就不需要自己创建,由spring创建,需要时直接从spring中获取并且有依赖关系是会spring会通过反射自动注入。
AOP就是不影响正常执行过程的前后加入额外的逻辑。比如权限,日志等,该执行的业务逻辑正常执行知识可以进行权限的判断核日志记录。
下面对ioc进行代码书写回顾:Classpathxml*applictionContext
导入项目所需的依赖
<dependencies> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--导入Spring的依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!--框架日志工具--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <!--Lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency> </dependencies>Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myDate" class="java.util.Date"></bean> </beans>Spring的测试
package com.bruceliu.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.Date; public class TestSpringIoc { /** * 基于xml配置文件 */ @Test public void test() throws Exception { //通过xml初始化spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); System.out.println(context.getBean(Date.class)); //向获取spring中所有的bean的类型id String[] beanDefinitionNames = context.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println(beanDefinitionName); } } }上面是通过配置文件的方式注册bean,其实现在spring提倡以注解驱动的方式实现bean的注册
@Configuration:加了这个注解的类就相当于传统的一个applicationContext-xxx.xml @Bean:在标注了@Configuration的类里面的方式上面打上@bean就相当于在applicationContext-xxx.xml配置的一个<bean id=”userDao” class=”com.bruceliu.dao.UserDao”> Dao的名字默认就是方法名,如果想改方法名使用@Bean(“beanName”)
//注解类==配置文件 @Configuration //告诉spring这是一个注解类 public class MainConfig { //相当于在xml中配置了<bean id="" class="com.bruceliu.dao.UserDao"><bean/> @Bean("userDao") //指定bean的名字 public UserDao userDao01(){ return new UserDaoImpl(); } } public class MainConfigTest { @Test public void testIoc(){ //1传统方式xml方式 //ApplicationContext context = new ClassPathXmlApplicationContext( // "applicationContext.xml"); //UserDao userDao = context.getBean(UserDao.class); //System.out.println(userDao.loadUser(1L)); //2 注解方式不需要配置文件,那bean怎么配置呢? 获取容器的时候原来制定配置文件,现在制定配置类 ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class); UserDao userDao = context.getBean(UserDao.class); System.out.println(userDao.loadUser(1L)); String[] beanNamesForType = context.getBeanNamesForType(UserDao.class); for (String beanName : beanNamesForType) { System.out.println(beanName); } } }我们原来使用spring的使用不会在xml中一个一个配置bean,我们在再类上加上@Repository,@Service,@Controller @Component,并且注入时可以使用@AutoWired的注解注入。 这一切的功能都需要我们配置包扫描<context:component-scan base-package="com.bruceliu"/>. 然而现在注解驱动开发已经没有了配置文件,不能配置。但是提供了@ComponentScan,我们可以在配置类上面加上这个注解也是一样,并且也能扫描配置包项目的相关注解,也能完成自动注入。
接下来我们先来看扫描组件,后面再看注入
package com.bruceliu.service; import com.bruceliu.bean.User; import org.springframework.stereotype.Service; @Service public class UserService { public User getUser(Long id){ System.out.println("userservice..."); return null; } } package com.bruceliu.controller; import com.bruceliu.bean.User; import org.springframework.stereotype.Controller; @Controller public class UserController { //先不拷贝页面,直接打印即可 public User getUser(Long id){ System.out.println("usercontroller..."); return null; } } //注解类==配置文件 @Configuration //告诉spring这是一个注解类 @ComponentScan("com.bruceliu") public class MainConfig { //相当于在xml中配置了<bean id="" class="com.bruceliu.dao.UserDao"><bean/> @Bean("userDao") //指定bean的名字 public UserDao userDao01(){ return new UserDaoImpl(); } } public class MainConfigTest { @Test public void testIoc(){ ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class); for (String beanName : context.getBeanDefinitionNames()) { System.out.println(beanName); } } }注意1分开测试排除和包含 注意2:其他配置类影响-本身扫描也包含配置类
