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());

    }
}

Q.E.D.


以无限为有限,以无法为有法