Spring的IOC学习记录Bean管理

97 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

IOC操作Bean管理(xml自动装配)

在上面的我们xml的装配都说手动装配

什么是自动装配

  • 根据指定装配规则(属性名称或者属性类型)Spring自动将匹配的属性值进行注入

bean标签属性autowire,配置自动装配 autowire属性常用两个值: byName根据属性名称注入 注入值bean的id值和类属性名称一样 byType更具属性类型注入--属性类型 下面是ByName和byType

<?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标签属性autowire,配置自动装配
autowire属性常用两个值:
  byName根据属性名称注入  注入值bean的id值和类属性名称一样
  byType更具属性类型注入
-->
    <bean id="emp2" class="com.Spring.autowire.Emp" autowire="byName">
   <!--<bean id="emp2" class="com.Spring.autowire.Emp" autowire="byType">-->
    <!--<property name="dept" ref="dept"></property>-->
</bean>
    <bean id="dept" class="com.Spring.autowire.Dept"></bean>
</beans>

@Autowired与@Resource异同:

  1. @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
  2. @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果 要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我 们想使用名称装配可以结合@Qualifier注解进行使用
  3. @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果 没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在 setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是 需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。 它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先 byName。

1.IOC操作Bean管理(外部属性文件)

1.配置数据库信息

  • 1.配置德鲁伊连接池

图片.png

内部创建信息

<?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="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://loaclhost/user" ></property>
        <property name="username" value="root" ></property>
        <property name="password" value="" ></property>
    </bean>
</beans>

外部创建文件jabc.properties文件进行数据库的连接

图片.png

再把外部properties文件属性引入到Spring配置文件中 引入context

<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">

进行属性的接入

<?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:property-placeholder location="classpath:jdbc.properties"/>
    <!--配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"></property>
        <property name="url" value="${prop.url}" ></property>
        <property name="username" value="${prop.userName}" ></property>
        <property name="password" value="${prop.password}" ></property>
    </bean>
</beans>

2.IOC操作Bean管理(基于注解)

1.什么是注解 注解是代码特殊标记、格式:@注解名称(属性名称=属性值) 使用注解,注解在作用在类上面、方法上面、属性上面,位置不一样,作用范围不一样 使用注解的目的:简化xml配置 2.Spring针对Bean管理中创建对象提供注解

  1. @Component
  2. @Service
  3. @Controller
  4. @Repository

上面的四个注解功能一样,都可以用来创建Bean实例

我们这些注解,就是替代了在配置文件当中配置步骤而已!更加的方便快捷!

  • @Component三个衍生注解 为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
  • @Controller:web层
  • @Service:service层
  • @Repository:dao层 写上这些注解,就相当于将这个类交给Spring管理装配了!

1.基于注解方式实现对象创建

1.引入依赖引入Spring的AOPjar包

图片.png

2.开启xml的组件扫描xml里面需要配置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.Spring.service,com.Spring.dao"></context:component-scan>
</beans>

实现类,可以将@的四个都可以实现

import org.springframework.stereotype.Component;
//value可以不写,不写的话就默认类名的首字母小写
@Component(value="userService") //<bean id="userService" class="">
public class UserService {
    public void add(){
        System.out.println("service add...");
    }
}

测试代码

    @Test
    public void testService(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
        UserService service = context.getBean("userService",UserService.class);
        System.out.println(service);
        service.add();
    }

限制扫描的范围

<?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.Spring.service,com.Spring.dao"></context:component-scan>

    <!-- 实例一限制扫描的范围
    use-default-filters="false"表示现在不使用默认filter,自己配置filter
    context:include-filter设置扫描那些内容
    expression="org.springframework.stereotype.Controller"只扫描Controller这个方式
    -->
    
    <context:component-scan base-package="com.Spring" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--示例二
    下面配置扫描包所有内容
    context:exclude-filter:设置那些内容不扫描
    -->
    <context:component-scan base-package="com.Spring">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

2.基于注解方式实现属性注入

  1. @AutoWired :根据属性类型进行自动装配 实现:把Service和dao对象创建,在Service和dao类田间创建对象
public class UserService {
    @Autowired
    private UserDao userDao;

    public void add() {
        System.out.println("add Service....");
        userDao.add();
    }
}

@Repository
public class UserDaoImpl implements UserDao {
    public void add() {
        System.out.println("dao add....");
    }
}

public interface UserDao {
    public void add();
}

<?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.Spring.service,com.Spring.dao"></context:component-scan>
    
</beans>
@Test
    public void testService(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
        UserService service = context.getBean("userService",UserService.class);
        service.add();
    }
  1. @Qualifier :根据属性名称进行注入

@Service
public class UserService {
    @Autowired//根据类型注入
    @Qualifier(value = "userDaoImpl")//根据名称注入
    private UserDao userDao;

    public void add() {
        System.out.println("add Service....");
        userDao.add();
    }
}
  1. @Resource :可以根据类型注入,也可以根据名称注入
@Service
public class UserService {
    //@Resource//根据类型注入
    @Resource(name = "userDaoImpl1") //根据名称注入
    private UserDao userDao;

    public void add() {
        System.out.println("add Service....");
        userDao.add();
    }
}

  1. @Value:注入普通类型属性
@Service
public class UserService {
   
    private UserDao userDao;
    @Value(value = "张三")
    private String name;

    public void add() {
        System.out.println("add Service"+name);
    }
}

. 可以不用提供set方法,直接在直接名上添加@value("值")

@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
@Value("秦疆")
// 相当于配置文件中 <property name="name" value="秦疆"/>
public String name;
}

.如果提供了set方法,在set方法上添加@value("值");

@Component("user")
public class User {
public String name;
@Value("秦疆")
public void setName(String name) {
this.name = name;
}
}

3.完全注解开发

1.创建配置类,替代xml配置文件

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = ("com.Spring")) //加上路径
public class SpringConfig {
}

实现配置类

@Test
    public void test(){
        //加载配置类
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    }

还有什么问题可以留言给我,会尽心解答的,觉得文章不错的话点个赞把