1.环境搭建
1.1.创建工程
1.2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qf</groupId>
<artifactId>Spring_NoXml</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
</dependencies>
</project>
1.3.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd ">
<!--配置spring要扫描的包-->
<context:component-scan base-package="com.qf"></context:component-scan>
</beans>
1.4.dao
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
public void addUser() {
System.out.println("insert into t_user... ...");
}
}
1.5.service
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void addUser() {
userDao.addUser();
}
}
1.6.client
public class client {
public static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext(SpringConfiguration.class);
UserService userService = ac.getBean("userServiceImpl", UserService.class);
userService.addUser();
}
}
1.7.待改造的问题
我们发现,之所以我们现在离不开xml配置文件,是因为我们有两处很关键的配置:
<beans>
<!--配置spring要扫描的包-->
<context:component-scan base-package="com.qf"></context:component-scan>
</beans>
如果他要也能用注解配置,那么我们就可以脱离xml文件了。
2.Spring的纯注解配置
2.1.新注解说明
2.1.1.@Configuration
-
作用:
用于指定当前类是一个spring配置类,当从一个类上加载到该注解时会创建spring容器。获取容器时需要使用AnnotationConfigApplicationContext(有@Configuration注解的类.class)。作用和在spring的xml配置文件中的:
<beans></beans>
是一样的。 -
示例代码
/** * spring的配置类 */ @Configuration//等价于<beans> public class SpringConfiguration{ }
2.1.2.@ComponentScan
-
作用:
用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的:
<context:component-scan base-package="com.qf"/>
是一样的。 -
属性:
basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
-
示例代码
/** * spring的配置类 */ @Configuration @ComponentScan(basePackages = "com.qf")//等价于<context:component-scan> public class SpringConfiguration{ }
2.1.3.@Bean
-
作用:
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。作用和在spring的xml配置文件中的:
<bean/>
是一样的。 -
属性:
name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
-
示例代码
public class Dog { private String nam; private Integer age; //set get...... }
@Bean public Dog dog(){ Dog dog = new Dog(); dog.setNam("二狗"); dog.setAge(18); return dog; }
2.1.3.@PropertySource
-
作用:
用于加载.properties文件中的配置。作用和在spring的xml配置文件中的:
<context:property-placeholder location="">
是一样的。 -
属性:
value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
-
示例代码
#config.properties nam=二狗 age=18
@Configuration @PropertySource("classpath:config.properties") public class SpringConfiguration { @Value("${nam}") private String nam; @Value("${age}") private Integer age; @Bean public Dog dog(){ Dog dog = new Dog(); dog.setNam(nam); dog.setAge(age); return dog; } }
2.1.4.@Import
-
作用:
@Import注解是用来导入配置类或者一些需要前置加载的类。作用和在spring的xml配置文件中的:
<import resource=""></import>
是一样. -
属性:
value[]:用于指定其他配置类的字节码。
-
示例代码
@Configuration @ComponentScan(basePackages = "com.qf") @Import({Configuration_Other.class}) public class SpringConfiguration { } @PropertySource("classpath:config.properties") public class Configuration_Other { }
2.2.测试
2.2.1.applicationContext.xml
删除applicationContext.xml配置文件:
2.2.2.dao
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private Dog dog;
public void addUser() {
System.out.println("insert into t_user... ...");
System.out.println(dog);
}
}
2.2.3.config
@PropertySource("classpath:config.properties")
public class Configuration_Other {
}
@Configuration//相当于把该类作为spring的xml配置文件中的<beans>
@ComponentScan(basePackages = "com.qf")//配置要扫描的包,等价于<context:component-scan>
@Import({Configuration_Other.class})
public class SpringConfiguration {
@Value("${nam}")
private String nam;
@Value("${age}")
private Integer age;
@Bean
public Dog dog(){
Dog dog = new Dog();
dog.setNam(nam);
dog.setAge(age);
return dog;
}
}
2.2.3.client
public class client {
public static void main(String[] args) {
//获取容器:由于我们已经没有了xml文件,所以再用读取xml方式就不能用了。
ApplicationContext ac =
new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = ac.getBean("userServiceImpl", UserService.class);
userService.addUser();
}
}