Spring----IOC、注解

news2025/4/20 6:16:05

目录

一、简介

二、spring的组成及拓展 

spring七大模块

核心容器(Spring core)

Spring上下文(Spring context)

Spring面向切面编程(Spring AOP)

Spring DAO模块

Spring ORM模块

Spring Web模块

Spring MVC框架(Spring WebMVC)

拓展

三、IOC理论

IOC本质

Hello Spring 

四、IOC创建对象的方式

1、使用无参构造创建对象,默认

2、使用有参构造创建对象

(1)下标赋值

(2)通过类型创建,不建议使用

(3)通过参数名

五、Spring配置说明

(1)别名

(2)Bean的配置

(3)import

六、依赖注入

(1)构造器注入

(2)Set方式注入【重点】

(3)拓展方式

(4)Bean的作用域

singleton(单例模式)默认

prototype(原型模式) 每次从容器中get的时候,都会产生一个新对象!

七、Bean的自动装配 

1、环境搭建

byName自动装配 

byType自动装配 

使用注解实现自动装配

@Autowired 

@Qualifier

@Resource

八、使用注解开发

1.bean

2.属性如何注入

3.衍生的注解

4.自动装配置

5.作用域

6.小结

九、使用Java的方式配置Spring

一、简介

Spring:春天------>给软件行业带来了春天!2002,首次推出了Spring框架的雏形: interface21框架!
Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。Rod Johnson ,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!

  • SSH : Struct2 + Spring + Hibernate!
  • SSM : SpringMvc + Spring + Mybatis!

官网: Spring Frameworkicon-default.png?t=N7T8https://spring.io/projects/spring-framework/#overview官方下载地址:JFrog (spring.io)icon-default.png?t=N7T8https://repo.spring.io/ui/native/release/org/springframework/springGitHub: (github.com)icon-default.png?t=N7T8https://github.com/spring-projects/spring-framework

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<grouprd>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

Spring框架是由于软件开发的复杂性而创建的。Spring就是一个轻量级的控制反转((loa)和面向切面编程(AOP)的框架
优点

  • Spring是一个开源的免费的框架(容器)!
  • Spring是一个轻量级的、非入侵式的框架!
  • 控制反转(IOC),面向切面编程(AOP) !
  • 支持事务的处理,对框架整合的支持!

二、spring的组成及拓展 

spring七大模块

核心容器(Spring core)

核心容器提供spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。BeanFactory使用依赖注入的方式提供给组件依赖。

Spring上下文(Spring context)

Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring面向切面编程(Spring AOP)

通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

Spring DAO模块

DAO模式主要目的是将持久层相关问题与一般的的业务规则和工作流隔离开来。Spring 中的DAO提供一致的方式访问数据库,不管采用何种持久化技术,Spring都提供一直的编程模型。Spring还对不同的持久层技术提供一致的DAO方式的异常层次结构。

Spring ORM模块

Spring 与所有的主要的ORM映射框架都集成的很好,包括hibernate、JDO实现、TopLink和IBatis SQL Map等。Spring为所有的这些框架提供了模板之类的辅助类,达成了一致的编程风格。

Spring Web模块

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web层使用Web层框架,可选的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。

Spring MVC框架(Spring WebMVC)

MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器。Spring支持多种视图技术

拓展

  • Spring Boot
    • 一个快速开发的脚手架。
    • 基于SpringBoot可以快速的开发单个微服务
    • 约定大于配置!
  • Spring Cloud
    • SpringCloud是基于SpringBoot实现的。

因为现在大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring及SpringMVC!弊端:发展了太久之后,东西越来越多,违背了原来的理念!配置十分繁琐,人称:“配置地狱!”

三、IOC理论

原来传统的方式

1、先写一个UserDao接口

public interface UserDao {
    public void getUser();
}

2、再去写Dao的实现类

public class UserDaoImpl implements UserDao {
    @override
    public void getUser(){
        System.out.print1n("获取用户数据");
    }
}

3、然后去写UserService的接口

public interface Userservice {
    public void getUser();
}

4、最后写Service的实现类

publig clacs UserserviceImpl implement Userservice {
    private UserDao userDao = new UserDaoImpl();

    @override
    public void getUser() {
        userDao.getUser();
    }
}

5、测试一下

@Test
public void test(){
    UserService service = new UserServiceImpl();
    service.getUser();
}

这是我们原来的方式,开始大家也都是这么去写的对吧

那我们现在修改一下把Userdao的实现类增加一个

public class UserDaoMySqlImpl implements UserDao {
    @override
    public void getUser(){
        System.out.print1n("MySql获取用户数据");
    }
}

紧接着我们要去使用MySql的话,我们就需要去service实现类里面修改对应的实现.

publig clacs UserserviceImpl implement Userservice {
    private UserDao userDao = new UserDaoMySqlImpl();

    @override
    public void getUser() {
        userDao.getUser();
    }
}

在假设,我们再增加一个Userdao的实现类

public class UserDaoOrscleImpl implements UserDao {
    @override
    public void getUser(){
        System.out.print1n("Orscle获取用户数据");
    }
}

那么我们要使用Oracle,又需要去service实现类里面修改对应的实现

publig clacs UserserviceImpl implement Userservice {
    private UserDao userDao = new UserDaoOracleImpl();

    @override
    public void getUser() {
        userDao.getUser();
    }
}

假设我们的这种需求非常大,这种方式就根本不适用了,甚至反人类对吧,每次变动,都需要修改大量代码﹒这种设计的耦合性太高了,牵一发而动全身.
那我们如何去解决呢?
我们可以在需要用到他的地方,不去实现它,而是留出一个接口,利用set,我们去代码里修改下
 

publig clacs UserserviceImpl implement Userservice {
    private UserDao userDao;
    
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

    @override
    public void getUser() {
        userDao.getUser();
    }

现在去测试类里,进行测试

@Test
public void test(){
    UsererviceImpl service = new UserServiceImpl();
    service.setUserDao(new UserDaoMySqlImpl());
    service.getUser();
    //那我们现在又想用Orical去实现呢
    service.setUserDao(new UserDaoOracleImpl());
    service.getUser();
}

仔细去思考一下,以前所有东西都是由程序去进行控制创建,而现在是由我们自行控制创建对象,把主动权交给了调用者,程序不用去管怎么创建,怎么实现了,它只负责提供一个接口

  • 之前,程序是主动创建对象!控制权在程序猿手上!
  • 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象!

这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型!

IOC本质

------->

控制反转loC(Inversion of Control),是一种设计思想DI(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

loC是Spring框架的核心内容,使用多种方式完美的实现了loC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现loC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从loc容器中取出需要的对象。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Injection,Dl)。

Hello Spring 

1、pojo文件夹下创建 Hello类

public class Hello {
    private String str;

    public string getstr() {
        return str;
    }
    public void setstr(String str) {
        this.str = str;
    }
    @Override
    public String toString() {
        return "He1lo{"+
            "str='" +str + '\''+
            '}';
    }
}

2、在resources文件夹下,创建applicationContext.xml文件

<?xml version="1.8" 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
      https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--使用Spring来创建对象,在Spring这些都称为Bean

    类型变量名= new类型();
    Hello hello = new Hello();

    id =变量名
    class = new的对象;
    property相当于给对象中的属性设置一个值!    
    -->
    <bean id="hello" class="com.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>

</beans>

3、在test文件夹下创建测试类

@Test
public void test (){
    //解析beans.xml文件,生成管理相应的Bean对象
    ApplicationContext context = newClassPathXm1lApplicationcontext("beans.xml");
    //getBean :参数即为spring配置文件中bean的id 
    Hello hello = (Hello)context.getBean("hello");
    hello.show ();
}

思考问题?

  • Hello 对象是谁创建的?
    • hello对象是由Spring创建的
  •  Hello对象的属性是怎么设置的?
    • hello对象的属性是由Spring容器设置的

这个过程就叫控制反转:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的
反转程序本身不创建对象,而变成被动的接收对象

依赖注入就是利用set方法来进行注入的
IOC是一种编程思想,由主动的编程变成被动的接收
可以通过newClassPathXmlApplicationContext去浏览一下底层源码
到了现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loC,一句话搞定:对象由Spring 来创建,管理,装配!

之前例子改写,用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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="mysqlImpl" class="com.dao.UserDaoMysqlImpl" />
    <bean id="oracleImpl" class="com.dao.UserDaoOracleImpl"/>
    <bean id="UserServicelmpl" class="com.kuang.service.UserServiceImpl">
        <!--ref : 引用spring容器中创建好的对象
            value :具体的值,基本数据类型!
        -->
        <property name="userDao" ref="mysqlImpl"/>
    </bean>
</beans>

测试不用再new了

public class MyTest {
    public static void main( String[] args) {
        //获取Applicationcontext;拿到Spring的容器
        ApplicationContext context = new classPathXmlApplicationContext("beans.xml");
        //容器在手,天下我有,需要什么,就直接get什么!
        UserServiceImpl userServiceImpl = (UserServiceImpl)     
                              context.getBean("UserServiceImpl");
        userServiceImpl.getUser();
}

四、IOC创建对象的方式

1、使用无参构造创建对象,默认

POJO----User 

public class User {
    private String name;
    
    public User(){
        System.out.println("User的无参构造!");
    }

    public string getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void show(){}
        System.out.println("name="+name);
    }
}

resources----->beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http: //www.w3.org/20日1/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.pojo.User">
        property name="name" value="花花"/>
    </bean>
</beans>

test--->MyTest测试类

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicat ionContext("beans.xml");
        User user = (User) context.getBean("user");//User的无参构造!
        user.show();//name=花花
}

2、使用有参构造创建对象

public class User {
    private String name;
    
    public User(String name){
       this.name=name;
    }

    public string getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void show(){}
        System.out.println("name="+name);
    }
}

(1)下标赋值

<bean id="user" class="com.pojo.User">
    <constructor-arg index"0" value="花花"/>
</bean>

(2)通过类型创建,不建议使用

<bean id="user"  class="com.pojo.User">
    <constructor-arg type="java.lang.String" value="花花"/>
</bean>

(3)通过参数名

<bean id="user"  class="com.pojo.User">
    <constructor-arg name="name" value="花花"/>
</bean>

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!

五、Spring配置说明

(1)别名

<!--别名,如果添加了别名,我们也可以使用别名获取到这个对象--> 
<alias name= "user" alias="userNew"/>

(2)Bean的配置

<! --
id : bean 的唯一标识符,也就是相当于对象名
class : bean对象所对应的全限定名:包名+类型
name :也是别名,而且name 可以同时取多个别名 空格,;都可识别
<bean id="user" class="com.pojo.User" name="user2 u2,u3;u4">
    <property name="name" value="花花"/>
</bean>

(3)import

这个import, 一般用于团队开发使用,他可以将多个配置文件,导入合并为一个。假设,现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!
●张三beans. xml
●李四beans2. xml
●王五beans3. xml
applicationContext.xml

<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>

使用的时候,直接使用总的配置applicationContext.xml就可以了

六、依赖注入

(1)构造器注入

前面已经说过了

(2)Set方式注入【重点】

●依赖注入: Set注入!
        依赖: bean对象的创建依赖于容器!
        注入: bean对象中的所有属性,由容器来注入!

【环境搭建】

1.复杂类型

public class Address {
    private String address;
    get set tostring...
}

2.真实测试对象 

public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys ;
    private Map<String,String> card;
    private Set<String> games;
    private String wife;
    private Properties info;

get set tostring 省略.....
}

3.beans.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="address" class="com.pojo.Address">

        <property name="address" value="西安"/>

    </bean>
    <bean id="student" class="com.pojo.Student">
        <!--普通值注入,value -->
        <property name="name" value="花花"/>

        <!--bean注入,ref -->
        <property name="name" ref="花花"/>

        <!--数组注入,array-value-->

        <property name="books">
                <array>
                        <value>红楼梦</value>

                        <value>西游记</value>

                        <value>水浒传</value>

                        <value>三国演义</value>

                </ array>
        </property>

        < !--List-->
        <property name="hobbys">
                <list>
                        <value>听歌</value>

                        <value>敲代码</value>

                        <value>看电影</value>

                </ list>
        </property>

        <! --Map-->
        <property name="card">
                <map>
                        <entry key="身份证" value="111111222222223333"/>

                        <entry key=“银行卡" value="1321231312312313123"/>

                </map>
        </property>
        < ! --set-->
        <property name="games">
                <set>
                        <value>LOL</value>

                        <value>coc</value>

                        <value>BOB</value>

                </set>
        </property>
        < !--null-->
        <property name="wife">
                <null/>
        </property>
        < ! --Properties-->
        <property name="info">
                <props>
                        <prop key="driver">eeffgggh</prop>

                        <prop key="url">afdsv</prop>
                        <prop key="username">root</prop>

                        <prop key="password">123456</prop>

                </props>
        </property>
    </bean>
</beans>

4.测试类

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicat ionContext("beans.xml");
        Studentr student = (Student) context.getBean("student");
        System.out.println(student.toString());
}

(3)拓展方式

官方文档Core Technologies (spring.io)

User类 

public class User {
private String name;

private int age;

public User(){}
public User(string name,int age) {
        this.name = name;
        this.age = age;
}

get set tostring.....
}

 userbeans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xm1ns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http: //www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www .springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--p命名空问注入,可以直接注入属性的值: property-->
    <bean id="user" class="com.pojo.User" p:name="花花" p:age="18"/>

    <!--c命名空间注入,通过构造器注入: construct-args-->
    <bean id="user2" class="com.pojo.User" c:age="18" c:name="西西" />

</beans>

测试

@Test
public void test2(){
       Applicationcontext context = new classPathxmlApplicationContext("userbeans.xml");

      User user = context.getBean("user2",User.class);//不用强制类型转换了
      System.out.println(user);

}

注意点:p命名和c命名空间不能直接使用,需要导入xml约束!
xmlns :c="http : / /www.springframework.org/schema/c"

xmlns :p="http : / /www.springframework.org/schema/p"

(4)Bean的作用域

singleton(单例模式)默认

<bean id="user2" class="com.pojo.user" c:age="18" c:name="花花"scope="singleton" />

@Test
public void test2(){
ApplicationGontext context = new ClassPathXm1ApplicationContext("userbeans.xml" );

User user = context.getBean("user2", User.class);
User user2 = context.getBean("user2", User.class);

System.out.println(user==user2);//true

}

prototype(原型模式) 每次从容器中get的时候,都会产生一个新对象!

<bean id="user2" class="com.kuang.pojo.user" c:age="18" c:name=""scope="prototype" />

@Test
public void test2(){
ApplicationGontext context = new ClassPathXm1ApplicationContext("userbeans.xml" );

User user = context.getBean("user2", User.class);
User user2 = context.getBean("user2", User.class);

System.out.println(user==user2);//false

}

3.其余的request、session、application、这些个只能在web开发中使用到!

七、Bean的自动装配 

  • 自动装配是Spring满足bean依赖一种方式!
  • Spring会在上下文中自动寻找,并自动给bean装配属性!

在Spring中有三种装配的方式

  • 1.在xml中显示的配置
  • 2.在java中显示配置
  • 3.隐式的自动装配bean【重要】

1、环境搭建

一个人有猫和狗,猫会叫miao,狗会叫wang

2、测试

<bean id="cat" class="com.pojo.Cat"/>

<bean id="dog" class="com.pojo.Dog"/>
<bean id="people" class="com.pojo.People">
        <property name="name" value="花花"/>
        <property name="dog" ref="dog"/>
        <property name="cat" ref="cat"/>

</ bean>

byName自动装配 

<bean id="cat" class="com.pojo.Cat"/>

<bean id="dog" class="com.pojo.Dog"/>

///<bean id="dog222" class="com.pojo.Dog"/>如果名字是dog222就找不到了

<!--byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的 beanid ! -->
<bean id="people" class="com.pojo.People" autowire="byName">
        <property name="name" value="花花"/>

</ bean>

byType自动装配 

 <bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="dog1111" class="com. kuang.pojo.Dog">

///<bean id="dog1" class="com. kuang.pojo.Dog">如果多一个Dog类型的就不行了

///<bclass="com. kuang.pojo.Dog">id省略也可以使用
<!--byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean !-->
<bean id="people" class="com.pojo.People" autowire="byType">
        <property name="name" value="花花"/>
</bean>

小结:

  • byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法后面的值一致!
  • bytype的时候,需要保证所有bean的类型class唯一,并且这个bean需要和自动注入的属性的类型一致!

使用注解实现自动装配

jdk1.5支持的注解,Spring2.5就支持注解了!官方原话:The introduction of annotation-based configurations raised the question of whether this approach is 'better' than XML.

要使用注解须知:

1.导入约束

2.配置注解的支持

<?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 id="cat" class="com.pojo.Cat" />

        <bean id="dog" class="com.pojo.Dog" />
        <bean id="people" class="com.pojo.People" / >

</beans>

@Autowired 

  • 直接在属性上使用即可!也可以在set方式上使用!
  • 使用Autowired我们可以不用编写Set方法了,前提是你这个自动装配的属性在IOC (Spring)容器中存在,且符合名字byname!

@Nullable

@Qualifier

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以使用@Qualifier(value="xxx")去配合@Autowired的使用,指定一个唯一的bean对象注入!

@Resource

会先根据id Name来找,找不到通过Type属性来找

小结:
Resource和@ Autowired的区别:

  • 都是用来自动装配的,都可以放在属性字段上
  • Autowired通过byType的方式实现,而且必须要求这个对象存在! 
  • @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现! 如果两个都找不到的情况下,就报错!
  • 执行顺序不同:@Autowired 通过byType的方式实现。@Resource默认通过byname的方式实现

八、使用注解开发

在Spring4之后,要使用注解开发,必须要保证aop的包导入了

使用注解需要导入context约束,增加注解的支持!

<?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.pojo"/>   
   <!--开启注解的支持-->
   <context:annotation-config/>
</beans>

1.bean

@Component

@Component组件 等价于<bean id="user" class="com.pojo.User" />

2.属性如何注入

@Component
public class User {

        //@value("huahua")可以放到属性
        public String name;
        //相当于<property name="name" value="huahua" />

        @value("huahua") 也可以放到set方法
        public void setName(String name) {
                this.name = name;
        }
}

3.衍生的注解

  • @Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!
    • dao 【@Repository
    • service 【@Service
    • controller 【@Controller

这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean 

4.自动装配置

  • - @Autowired :自动装配通过类型。名字
    • 如果Autowired不能唯一自动装配上属性,则需要通过@Qualifier(value="xxx")
  • - @Nullable字段标记了这个注解,说明这个字段可以为null;
  • - @Resource:自动装配通过名字。类型。

5.作用域

@Scope

6.小结

xml 与注解:

  • xml 更加万能,适用于任何场合!维护简单方便。
  • 注解不是自己类使用不了,维护相对复杂!

xml与注解最佳实践:

  • xml 用来管理bean;
  • 注解只负责完成属性的注入;
  • 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持

<!--指定要扫描的包,这个包下的注解就会生效-->
<context: component-scan base-package="com.pojo"/>   
<!--开启注解的支持-->
<context:annotation-config/>

九、使用Java的方式配置Spring

我们现在要完全不使用Spring的xml配置了,全权交给Java来做!
JavaConfig 是Spring的一个子项目,在Spring 4之后,它成为了一个核心功能!

pojo-->User

//这里这个注解的意思,就是说明这个类被Spring接管了,注册到了容器中
@Component
public class User {
    private String name;
    public String getName() {
        return name;
    }


    @Value("huahua")//属性注入值
    public void setName(String name) {
        this.name = name;
    }
    @override
    public string toString() {
    return "User{"+
            "name='" +name + '\''+
            '}';
    }
}

config-->Config 配置文件

//这个也会Spring容器托管,注册到容器中,因为他本来就是一个@Component
//@Configuration代表这是一个配置类,就和我们之前看的beans.xml
@Configuration
@ComponentScan("com.pojo")
@Import(Config2.class)//两个类引成一个类,相当于导入了
public class Config {
    //注册一个bean,就相当于我们之前写的一个bean标签
    //这个方法的名字,就相当于bean标签中的id属性
    //这个方法的返回值,就相当于bean标签中的class属性
    @Bean
    public User getUser(){
        return new User();//就是返回要注入到bean的对象!
    }
}

test--->MyTest

public class MyTest {
    public static void main(string[] args) {
    //如果完全使用了配置类方式去做,我们就只能通过AnnotationConfig上下文来获取容器,通过配置类的class对象加载
    ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
    User getUser = (User) context.getBean("getUser");
    System.out.println(getUser.getName());
    }
}

这种纯Java的配置方式,在SpringBoot中随处可见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/998869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11.(Python数模)(预测模型三)多元线性回归预测

多元线性回归 简介 多元线性回归使用在自变量和因变量有逻辑相关性的情况中。在实际应用中&#xff0c;多元线性回归经常用于探索和解释变量之间的复杂关系&#xff0c;例如经济学、社会科学和自然科学等领域。它提供了一种统计工具来分析多个自变量对因变量的影响&#xff0…

Windows下使用source insight连接远程Linux机器写代码

命令总结 基本会用到的命令都在这里了&#xff0c;流程里面就不加命令了&#xff0c;自行看表格 流程 linux安装 samba&#xff0c;并确认版本&#xff0c;确认samba服务运行状态配置samba用户配置samba的配置文件 在文件最后增加 示例如下&#xff1a; security user [pub…

大模型参数高效微调PEFT的理解和应用

简介 近年的大型语言模型&#xff08;也被称作基础模型&#xff09;&#xff0c;大多是采用大量资料数据和庞大模型参数训练的结果&#xff0c;比如常见的ChatGPT3有175B的模型参数量。随着Large Language Model(LLM)的横空出世&#xff0c;网络模型对常见问题的解答有了很强的…

分享大数据分析培训就业班课程内容

随着国家重视大数据&#xff0c;政府扶持大数据&#xff0c;大数据在企业中生根发芽根据人社部发布的《新职业--大数据工程技术人员就业景气现状分析报告》预计&#xff0c;未来5年&#xff0c;大数据行业的人才需求将保持30%-40%的增速&#xff0c;人才缺口总量将达到2000万人…

冠达管理股票分析:权益分派前买入好不好?

随着股票市场的不断升温&#xff0c;出资者们也越来越关注买入时机的把握。而其中一个重要的要素就是权益分配。那么&#xff0c;权益分配前买入好不好呢&#xff1f;本文将从多个视点进行剖析。 1、剖析权益分配对股价的影响&#xff0c;推断买入时机的合理性。权益分配是上市…

地图结构 | 图解占据栅格地图原理(附Matlab建图实验)

目录 0 专栏介绍1 栅格地图1.1 应用场景1.2 基本概念 2 占据栅格地图2.1 更新模型2.2 截断策略 3 仿真实现3.1 算法流程3.2 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索…

蚂蚁开源编程大模型,提高开发效率

据悉&#xff0c;日前蚂蚁集团首次开源了代码大模型 CodeFuse&#xff0c;而这是蚂蚁自研的代码生成专属大模型&#xff0c;可以根据开发者的输入提供智能建议和实时支持&#xff0c;帮助开发者自动生成代码、自动增加注释、自动生成测试用例、修复和优化代码等kslouitusrtdf。…

小红书母婴行业文案怎么写,创作方向有哪些?

行业文案顾名思义就是有关于某个行业的文案&#xff0c;不过此类内容一般都具有商业性。随着互联网的深入&#xff0c;怎么对行业文案进行创作&#xff0c;也成为品牌的日常工作。今天为大家分享下小红书母婴行业文案怎么写&#xff0c;创作方向有哪些&#xff1f; 首先&#x…

arppy gis 读取text 并批量添加字段 arcpy.AddField_management

arppy gis 读取text 并批量添加字段 arcpy.AddField_management 例&#xff1a;给“省级行政区域”添加“A、B、C、D” 4个字段。 &#xff08;1&#xff09;用Excel制作出字段及其描述表&#xff0c;定义字段结构&#xff1b; &#xff08;2&#xff09;复制除标题行以为的内…

windows本地验证码识别小工具

windows本地验证码识别小工具 - 可以用在windows系统中&#xff0c;并可以集成在Java或python程序中 演示视频如下&#xff1a;可用于识别4-7位的字母数字组合的验证码&#xff08;识别准确率在70% - 80%&#xff09;。 验证码识别演示 本项目未开源&#xff0c;如需使用请联…

DELL 台式机的内置扬声器如何关闭

DELL 台式机的内置扬声器如何关闭&#xff1f; 点“开始”——控制面板——高清晰音频管理器——右上角“设备高级设置”——“播放设备”——点击“使前部和后部设备播放不同的音频流”前面的小方框——“确认”。ok了。

14-JVM调优实战-常量池详解

上一篇&#xff1a;13-JVM调优实战-3 最后&#xff0c;来一个算是补充拓展知识点&#xff0c;希望可以帮到你。 1.Class常量池与运行时常量池 Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外&#xff0c;还有…

win7安装不了python3.10.8

今天安装python3.10.8&#xff0c;发现安装失败。原来是win7不支持python3.10.8。 如图&#xff1a; 安装出现问题&#xff1a; win7能安装python3哪个版本&#xff0c;我正在测试。到时补充编辑。

Web Components详解-Shadow DOM插槽

前言 插槽实际上也属于组件通信的一种方式&#xff0c;但是由于其强大的api和实用性&#xff0c;我将其单独拆开来介绍。 定义 Slot&#xff08;插槽&#xff09;是Web Components中一个重要的特性&#xff0c;它允许在组件内部定义占位符&#xff0c;以便父组件可以向其中插…

好用的工具推荐

1 chatgpt国内版 ChatMindAI ChatMindAI-智慧学习&#xff0c;办公无忧&#xff0c;AIGC让生活更简单https://x.chatmindai.net/explore

sovits远程访问设置

感谢阅读 把blocks.py的如下部分&#xff0c;false改为true

无涯教程-JavaScript - DOLLARDE函数

描述 DOLLARDE函数将以整数部分和小数部分(如1.02)表示的美元价格转换为以十进制数表示的美元价格。分数美元数字有时用于证券价格。值的小数部分除以您指定的整数。 语法 DOLLARDE (fractional_dollar, fraction)争论 Argument描述Required/OptionalFractional_dollarA nu…

SpringMVC的文件上传文件下载多文件上传---详细介绍

目录 前言&#xff1a; 一&#xff0c;文件上传 1.1 添加依赖 1.2 配置文件上传解析器 1.3 表单设置 1.4 文件上传的实现 二&#xff0c;文件下载 controller层 前端jsp 三&#xff0c;多文件上传 Controller层 运行 前言&#xff1a; Spring MVC 是一个基于 Java …

使用迭代方式解决汉诺塔问题(Java语言)

目录 汉诺塔问题解决 迭代介绍 汉诺塔问题解决 在这个Java示例中&#xff0c;我们使用了一个Stack数据结构来模拟递归调用的过程。hanoiIterative函数接受盘子数量n以及三个柱子的名称作为参数&#xff0c;并在迭代过程中模拟汉诺塔的移动操作。moveDisk函数用于模拟盘子的移…

零钱兑换00

题目链接 零钱兑换 题目描述 注意点 如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1可以认为每种硬币的数量是无限的 解答思路 动态规划从总金额1开始推出目标金额所需的最少硬币个数&#xff0c;任意某个金额所需的最少硬币个数可以由当前金额减去每种面额的硬…