Spring是一个开源框架,为简化企业级开发而生,使用Spring开发可以将Bean对象,Dao组件对象,Service组件对象等交给Spring容器来管理,这样使得很多复杂的代码在Spring中开发却变得非常的优雅和简洁,有效的降低代码的耦合度,极大的方便项目的后期维护、升级和扩展。
1.xml模板
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启注解的支持-->
<context:annotation-config/>
<!--指定要扫描的包,这个包下的注解就会生效-->
<context:component-scan base-package="com.jiutian.pojo"/>
<!--通过配置织入@Aspectj切面,开启注解支持 JDK(默认 proxy-target-class="false") cglib(proxy-target-class="true")-->
<aop:aspectj-autoproxy/>
</beans>
2.常用依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.springframework/spring-jdbc/5.3.9-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
3.自动装配(注解)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- 开启注解的支持-->
<context:annotation-config/>
<!--bean-->
</beans>
@Autowired:自动装配 先类型后名字
(required = false)(说明这个对象可以为空)
默认按照类型进行装配如果类型不唯一,再根据名字[默认根据set方法属性值名,可以用@Qualifier(value="xxx")来指定]
@Resource:自动装配 先名字后类型
默认按照名字进行装配,如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
另外可参考:https://www.cnblogs.com/williamjie/p/9198157.html
4.注解(@Component)+配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!--指定要扫描的包,这个包下的注解就会生效-->
<context:component-scan base-package="com.jiutian.pojo"/>
<!--开启注解的支持-->
<context:annotation-config/>
</beans>
@Component ,@Repository, @Service, @Controller 这四个注解是等效的,注解后可以被spring框架所扫描并注入到spring容器来进行管理 。
- @Component,是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能 。
- @Repository,注解在持久层(dao)中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
- @Service,是业务逻辑层 (service) 注解,这个注解只是标注该类处于业务逻辑层。
- @Controller, 是spring-mvc(controller)的注解,具有将请求进行转发,重定向的功能。
@Component
public class User {
@Value("李四") //注入属性值
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Repository
public class UserDao {
}
@Service
public class UserService {
}
@Controller
public class UserController {
}
5.纯注解(java config)
@Configuration //代表这是一个配置类,类似于beans.xml
@ComponentScan("com.jiutian.pojo") //指定扫描的包
@Import(MyConfig2.class) //引入配置类
public class MyConfig {
//相当于一个bean标签
/*
如果未指定包,则id为方法名,
如果指定了扫描的包,id也可以为实体类名首字母小写,(则对应的实体类必须要加@Component注解)
所以一般需要指定扫描的包。
方法返回值相当于bean标签的class属性
*/
@Bean //(name = "user1") //相当于替换了方法名
//@Scope("prototype")
public User getUser(){
return new User(); //返回bean对象
}
}
//实体类
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("李四")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
//测试类
public class MyTest {
public static void main(String[] args) {
//通过AnnotationConfig上下文获取容器,通过配置类的class对象加载
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User user = context.getBean("user", User.class);
System.out.println(user.getName());
}
}